Logical circuits and logical gates simulator
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 :
- NOT
- AND
- OR
- NAND
- NOR
- XOR
- XNOR
- Simple left to right pip.
- Simple Up to down and down to up pip.
- 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.