65.9K
CodeProject is changing. Read more.
Home

Logical circuits and logical gates simulator

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.79/5 (18 votes)

Oct 1, 2003

CPOL
viewsIcon

82498

downloadIcon

6479

Logical circuits and logical gates simulator. A program similar to PSpice.

Introduction

This is a simple sample to simulate basic logical circuits (I hope I can develop this for FLIP-FLOPs too). There are all the  main gates in this program.

The list of Gates is :

  1. NOT
  2. AND
  3. OR
  4. NAND
  5. NOR
  6. XOR
  7. XNOR
  8. Simple left to right pip.
  9. Simple Up to down and down to up pip.
  10. Two way pip.

After drawing your gates on the board, right click on the board for TRACE menu. Select trace to see final result . You can change your trace mode from left top dialog in two modes : 1 - Fast mode. 2 - Step By Step .

Note : You can deleted any drawn gates by selecting delete tool from the left-side toolbox. And you can minimize/restore toolbox by clicking the pointer button on top left and button left side of toolbox.

Code Listing

// This is a function that select correc cursor for mouse pointer .

BOOL CLCView::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
  m_pViewWnd=pWnd;
  
  switch (m_dToolBox.CursorValue){
  case AND:  
    lhCursor=AfxGetApp()->LoadCursor(IDC_AND);
    SetCursor(lhCursor);
    ShowFlag=TRUE;
    break;

  case NAND:
    lhCursor=AfxGetApp()->LoadCursor(IDC_NAND);
    SetCursor(lhCursor);
    ...........  
} 

// This a function to draw selected gates on board 

// (after you click this gate on board)

void CLCView::ShowBitmap(int x,int y,int kind)
{
  CDocument* pDoc = GetDocument();
  CClientDC dc(this);
  CBitmap bitmap;
  CDC dcMemory;
  BITMAP bm;
  
  switch (kind) {
  case AND  : 
    bitmap.LoadMappedBitmap(IDB_AND,0);
    break;

  case NAND : 
    bitmap.LoadMappedBitmap(IDB_NAND,0);

// Call main calculator function

void CLCView::OnCalc() 
{
  m_dToolBox.UpdateData(TRUE);
  
  if (m_dToolBox.m_rOption==0)
    FastTrace=TRUE;    
  else
    FastTrace=FALSE;    

  m_dToolBox.UpdateData(FALSE);
  
  Calc();
}

// This function is like a snapper grid

boolean CLCView::Snaper(int x, int y,int kind)
{
  x=(x/32)*32;
  y=(y/32)*32;
  
  if(ShowFlag==TRUE)
  {
    ShowBitmap(x,y,m_dToolBox.CursorValue);
    ScreenMap(x,y,m_dToolBox.CursorValue);
  }
  else
  if (kind==_DEL)
  {
    ShowBitmap(x,y,m_dToolBox.CursorValue);
  .....
  .....
  }
...
}


// This function save your drawes gates for calculate

boolean CLCView::ScreenMap(int x, int y,int kind)
{
  int xMem,yMem;
  
  xMem=x/32;
  yMem=y/32;

  switch (kind) {
  case AND  : 
    screen[xMem][yMem].Gate=AND;
    screen[xMem][yMem].SGate="AND";
    screen[xMem][yMem].Group=1;
    screen[xMem][yMem].lunched=1;
    break;

  case NAND : 
    screen[xMem][yMem].Gate=NAND
...
...
// and this is calculatore of program

void CLCView::Calc()
{
for (int i=0;i<32;i++)
  for (int j=0;j<24;j++)
    if (screen[i][j].lunched==1)
    {
      UpdateData(FALSE);
      switch (screen[i][j].Gate)
      {
      case AND :
        {
        switch (screen[i-1][j].Gate) 
        {
        case DLR :
          screen[i][j].inValue1=screen[i-1][j].outValue1;
...........
.............
..............
}

Conclusion

If you have found any bug or if you can improve the code please contact me by my email at : mh2538@yahoo.com  or XpolitiX@yahoo.com. Thanks and bye.