Mega Code Archive

 
Categories / C / Games Graphic
 

Prog to implement a boolean function using a multiplexer logic

#include<dos.h> #include<math.h> #include<stdio.h> #include<conio.h> #include<stdlib.h> #include<graphics.h> #define N 500 int function[35]; int strobe[5] = { 0,0,0,0,0 }; int store[16] = { 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 }; int inputs[16]; int output=0,count=0,decieq,choice; int driver=DETECT,mode; /***********FUNCTIONS FOR BEGINING GUI***************/ struct stars { int x,y,x1,y1,z,c; }STARS[N]; void init() { int i,t; for(i=0;i<N;i++) { STARS[i].c=2; STARS[i].x = random(640); STARS[i].y = random(460); STARS[i].x1= random(320); STARS[i].y1= random(220); t=random(325); if(t==0) STARS[i].z=t+random(25)+1;//TO AVOID ERROR(division by 0) else STARS[i].z=t; } } void draw() { int i; for(i=0;i<N;i++) { if(STARS[i].y<480) putpixel(STARS[i].x,STARS[i].y,STARS[i].c); } } void erase() { int i; for(i=0;i<N;i++) putpixel(STARS[i].x,STARS[i].y,0); //putting black //color at stars position } /* if you use z+=2 stars will go away from you , but remember to change the condition :- if(STARS[i].z<1) {STARS[i].z=325;} to if(STARS[i].z>325) {STARS[i].z=1;} */ void move() { int i; for(i=0;i<N;i++) { STARS[i].x=((STARS[i].x1 * 640)/STARS[i].z)+320;//320 x-origin STARS[i].y=((STARS[i].y1 * 300)/STARS[i].z) +220;//220 y-origin STARS[i].z-=2; if(STARS[i].z<1) STARS[i].z=325; else if(STARS[i].z<162) STARS[i].c=15; else STARS[i].c=7; } } void showstars() { int i; init(); while(!kbhit()) { setcolor(3); //3 for cyan settextstyle(1,0,3); outtextxy(230,5,"PROJECT ON"); settextstyle(10,0,3); setcolor(i); outtextxy(170,30,"MULTIPLEXERS"); setcolor(5); settextstyle(1,0,3); move(); draw(); delay(15); erase(); i++; } closegraph(); restorecrtmode(); } void welcome() { int i, j, x, y, color; int MaxColors; struct palettetype palette; struct viewporttype vp; int height, width; initgraph(&driver,&mode,"f:\tc\bgi"); MaxColors = getmaxcolor() + 1; textcolor(4+BLINK); printf(" WELCOME"); textcolor(15); getpalette( &palette ); setviewport(0,50,630,470,1); getviewsettings( &vp ); width = (vp.right - vp.left) / 15; //width height = (vp.bottom - vp.top) / 10; // height x = y = 0; // Start in upper corner color = 1; // Begin at 1st color for( j=0 ; j<10 ; ++j ) { // 10 rows of boxes for( i=0 ; i<15 ; ++i ) { // 15 columns setfillstyle( SOLID_FILL, color++ );//Set the color bar( x, y, x+width, y+height ); // Draw the box x += width + 1; // Advance to next col color = 1 + (color % (MaxColors - 2));// Set new color } // End of i loop x = 0; // Goto 1st column y += height + 1; // Goto next row } // End of j loop while( !kbhit() ) // Until a key is hit setpalette( 1+random(MaxColors - 2), random( 65 ) ); setallpalette( &palette ); getch(); closegraph(); restorecrtmode(); initgraph(&driver,&mode,"f:\tc\bgi"); showstars(); } /*********Begining GUI ends.Text mode begins*********/ /**************MULTIPLEXER FUNCTIONS*****************/ void message(int num) //gives a message to user { //everytime select input is entered printf(" Only first %d select inputs considered.rest rejected(if any) ",num); } int check(int num) //For checking that a particular no. { //is present in function or not int ctr2; for(ctr2=0;ctr2<count;ctr2++) if(function[ctr2]==num) return (1); //true return(0); //false } void check_invalid_strobe(int ctr2) //for checking invalid select input { if(strobe[ctr2]>1 || strobe[ctr2]<0) { printf(" Invalid select input"); exit(2); } } void decide_output(int count) //decides whether output is 1 or 0 { //for normal mux implementation int ctr2; for(ctr2=0;ctr2<count;ctr2++) { if(decieq==function[ctr2]) { output = 1; break; } } } void decide_complex_inputs(int num) //decides inputs of a Mux which { //implements a function of a higher //level Mux int ctr2; for(ctr2=0;ctr2<num;ctr2++) { if(check(ctr2)) { if(check(ctr2+num)) inputs[ctr2]=1; else { inputs[ctr2]=!(strobe[0]); store[ctr2] = 0; } } else { if(check(ctr2+num)) { inputs[ctr2]=strobe[0]; store[ctr2] = 1; } else inputs[ctr2]=0; } } } void display_complex_input(int num) //displays inputs of a Mux which { //implements a function of a higher //level Mux int i; for(i=0;i<num;i++) { if(store[i]==0) printf(" Input %d = %s(%d)",i,"a bar",inputs[i]); else if(store[i]==1) printf(" Input %d = %c(%d)",i,'a',inputs[i]); else printf(" Input %d = %d",i,inputs[i]); } } void take_input(int num) //for taking select input in normal Mux { int ctr2; printf(" Enter the select input: "); for(ctr2=0;ctr2<num;ctr2++) { scanf("%d",&strobe[ctr2]); check_invalid_strobe(ctr2); } } void take_input_a(int num) //for taking input a in case of complex { //implementation of a function printf(" Enter the value of a(MSB of select input for %d:1) : ",num); scanf("%d",&strobe[0]); check_invalid_strobe(0); printf(" Only one value of MSB considered.rest rejected(if any) "); } void take_complex_select_input(int num) { int ctr2; printf(" Enter the select input: "); for(ctr2=1;ctr2<num;ctr2++) { scanf("%d",&strobe[ctr2]); check_invalid_strobe(ctr2); } printf(" Only first %d select inputs considered.rest rejected(if any)",num-1); printf(" Press any key to continue...."); getch(); } void display_output() { printf(" Output is : %d",output); printf(" Input %d is selected as output.",decieq); printf(" Press any key to continue....."); getch(); } void display_complex_output() { output = inputs[decieq]; printf(" Output is: %d",output); printf(" Input %d is selected as output.",decieq); printf(" Press any key to continue...."); getch(); } void two_is_to_one() { take_input(1); message(1); decieq = strobe[0]*1; decide_output(count); display_output(); } void four_is_to_one() { int ctr2; take_input(2); message(2); decieq = strobe[0]*2 + strobe[1]*1; decide_output(count); display_output(); } void eight_is_to_one() { int ctr2; take_input(3); message(3); decieq = strobe[0]*4 + strobe[1]*2 + strobe[2]*1; decide_output(count); display_output(); } void sixteen_is_to_one() { int ctr2; take_input(4); message(4); decieq = strobe[0]*8 + strobe[1]*4 + strobe[2]*2 + strobe[3]*1; decide_output(count); display_output(); } void thirtytwo_is_to_one() { int ctr2; take_input(5); message(5); decieq = strobe[0]*16 + strobe[1]*8 + strobe[2]*4 + strobe[3]*2 + strobe[4]*1; decide_output(count); display_output(); } void complex_two_is_to_one() { int ctr2; take_input_a(4); take_complex_select_input(2); message(1); decide_complex_inputs(2); decieq = strobe[1]*1; clrscr(); display_complex_input(2); display_complex_output(); } void complex_four_is_to_one() { int ctr2; take_input_a(8); take_complex_select_input(3); message(2); decide_complex_inputs(4); decieq = strobe[1]*2 + strobe[2]*1; clrscr(); display_complex_input(4); display_complex_output(); } void complex_eight_is_to_one() { int ctr2; take_input_a(16); take_complex_select_input(4); message(3); decide_complex_inputs(8); decieq = strobe[1]*4 + strobe[2]*2 + strobe[3]*1; clrscr(); display_complex_input(8); display_complex_output(); } void complex_sixteen_is_to_one() { int ctr2; take_input_a(32); take_complex_select_input(5); message(4); decide_complex_inputs(16); decieq = strobe[1]*8 + strobe[2]*4 + strobe[3]*2 + strobe[4]*1; clrscr(); display_complex_input(16); display_complex_output(); } /**********MULTIPLEXING FUNCTIONS END*******************/ /****************CIRCUIT GUI****************************/ void common_gui(int num) { int y[32],i,i2,k; double j=log(num)/log(2); char str[2]; int stepsize=((280+num*3)-180)/(j+1); for(i=0;i<32;i++) y[i]=80 + (i+1)*10; initgraph(&driver,&mode,"f:\tc\bgi"); outtextxy(20,5,"RED: logic level 1"); outtextxy(250,5,"Press any key to continue....."); outtextxy(20,15,"GREEN:logic level 0"); for(i=0;i<num;i++) { if(check(i)) { setcolor(WHITE); circle(150,y[i],2); setfillstyle(SOLID_FILL,RED); floodfill(150,y[i],WHITE); } else { setcolor(15); circle(150,y[i],2); setfillstyle(SOLID_FILL,GREEN); floodfill(150,y[i],WHITE); } line(154,y[i],180,y[i]); } rectangle(180,40,280+num*3,y[i-1]+40); line(280+num*3,(y[i-1]-40)/2 + 60,280+3*num+40,(y[i-1]-40)/2 + 60); if(output==1) { setcolor(15); circle(280+num*3+44,(y[i-1]-40)/2 + 60,4); setfillstyle(SOLID_FILL,RED); floodfill(280+num*3+44,(y[i-1]-40)/2 + 60,WHITE); } else { setcolor(15); circle(280+num*3+44,(y[i-1]-40)/2 + 60,4); setfillstyle(SOLID_FILL,GREEN); floodfill(280+num*3+44,(y[i-1]-40)/2 +60,WHITE); } outtextxy(280+num*3+50,(y[i-1]-40)/2 + 60," Y(Output = )"); itoa(output,str,10); outtextxy(280+num*3+150,(y[i-1]-40)/2 + 60,str); itoa(num,str,10); outtextxy(140,y[i-1]+72," Block Diagram of "); outtextxy(290,y[i-1]+72,str); outtextxy(293,y[i-1]+72," : 1 Mux"); outtextxy((280+num*3-180)/2 + 150,y[(i-1)/2],str); outtextxy((280+num*3-180)/2 + 160,y[(i-1)/2]," : 1"); outtextxy((280+num*3-180)/2 + 150,y[(i-1)/2+2]," MUX"); outtextxy(280+num*3+170,(y[i-1]-40)/2 + 60,"(I "); itoa(decieq,str,10); outtextxy(280+num*3+185,(y[i-1]-40)/2 + 60,str); outtextxy(280+num*3+192,(y[i-1]-40)/2 + 60," )"); outtextxy(130,y[0]-5,"I0"); itoa(num-1,str,10); outtextxy(126,y[i-1],"I"); outtextxy(133,y[i-1],str); for(i2=0;i2<j;i2++) for(k=0;k<20;k++) { line(180+(i2+1)*stepsize,y[i-1]+40,180+(i2+1)*stepsize,y[i-1]+60); if(strobe[i2]==0) { setcolor(15); circle(180+(i2+1)*stepsize,y[i-1]+62,2); setfillstyle(SOLID_FILL,2); floodfill(180+(i2+1)*stepsize,y[i-1]+62,15); } else { setcolor(15); circle(180+(i2+1)*stepsize,y[i-1]+62,2); setfillstyle(SOLID_FILL,4); floodfill(180+(i2+1)*stepsize,y[i-1]+62,15); } } outtextxy(185+(i2)*stepsize,y[i-1]+62,"S0"); itoa(j-1,str,10); outtextxy(162+stepsize,y[i-1]+62,"S "); outtextxy(170+stepsize,y[i-1]+62,str); if(num==2) { setcolor(0); outtextxy(162+stepsize,y[i-1]+62,"S0"); setcolor(15); } getch(); } void common_complex_gui(int num) { int y[32],i,i2,k; double j=log(num)/log(2); char str[2]; int stepsize=((280+num*3)-180)/(j+1); for(i=0;i<32;i++) y[i]=80 + (i+1)*10; initgraph(&driver,&mode,"f:\tc\bgi"); outtextxy(20,5,"RED: logic level 1"); outtextxy(250,5,"Press anu key to continue....."); outtextxy(20,15,"GREEN:logic level zero"); for(i=0;i<num;i++) { if(inputs[i]==1) { setcolor(WHITE); circle(150,y[i],2); setfillstyle(SOLID_FILL,RED); floodfill(150,y[i],WHITE); } else { setcolor(15); circle(150,y[i],2); setfillstyle(SOLID_FILL,GREEN); floodfill(150,y[i],WHITE); } line(154,y[i],180,y[i]); } rectangle(180,40,280+num*3,y[i-1]+40); line(280+num*3,(y[i-1]-40)/2 + 60,280+3*num+40,(y[i-1]-40)/2 + 60); if(output==1) { setcolor(15); circle(280+num*3+44,(y[i-1]-40)/2 + 60,4); setfillstyle(SOLID_FILL,RED); floodfill(280+num*3+44,(y[i-1]-40)/2 + 60,WHITE); } else { setcolor(15); circle(280+num*3+44,(y[i-1]-40)/2 + 60,4); setfillstyle(SOLID_FILL,GREEN); floodfill(280+num*3+44,(y[i-1]-40)/2 +60,WHITE); } outtextxy(280+num*3+50,(y[i-1]-40)/2 + 60," Y(Output = )"); itoa(output,str,10); outtextxy(280+num*3+150,(y[i-1]-40)/2 + 60,str); itoa(num,str,10); outtextxy(140,y[i-1]+72," Block Diagram of "); outtextxy(290,y[i-1]+72,str); outtextxy(293,y[i-1]+72," : 1 Mux"); outtextxy((280+num*3-180)/2 + 150,y[(i-1)/2],str); outtextxy((280+num*3-180)/2 + 160,y[(i-1)/2]," : 1"); outtextxy((280+num*3-180)/2 + 150,y[(i-1)/2+2]," MUX"); outtextxy(280+num*3+170,(y[i-1]-40)/2 + 60,"(I "); itoa(decieq,str,10); outtextxy(280+num*3+185,(y[i-1]-40)/2 + 60,str); outtextxy(280+num*3+192,(y[i-1]-40)/2 + 60," )"); outtextxy(130,y[0]-5,"I0"); itoa(num-1,str,10); outtextxy(126,y[i-1],"I"); outtextxy(133,y[i-1],str); for(i2=1;i2<=j;i2++) for(k=0;k<20;k++) { line(180+(i2)*stepsize,y[i-1]+40,180+(i2)*stepsize,y[i-1]+60); if(strobe[i2]==0) { setcolor(15); circle(180+(i2)*stepsize,y[i-1]+62,2); setfillstyle(SOLID_FILL,2); floodfill(180+(i2)*stepsize,y[i-1]+62,15); } else { setcolor(15); circle(180+(i2)*stepsize,y[i-1]+62,2); setfillstyle(SOLID_FILL,4); floodfill(180+(i2)*stepsize,y[i-1]+62,15); } } outtextxy(185+(i2-1)*stepsize,y[i-1]+62,"S0"); itoa(j-1,str,10); outtextxy(162+stepsize,y[i-1]+62,"S "); outtextxy(170+stepsize,y[i-1]+62,str); if(num==2) { setcolor(0); outtextxy(162+stepsize,y[i-1]+62,"S0"); setcolor(15); } getch(); } /************CIRCUIT GUI ENDS**********************/ /********************MAIN FUNCTION*****************/ void main() { int ctr=0; welcome(); clrscr(); printf(" Prog to implement a function using a multiplexer logic:-"); printf(" Enter the function in minterms only."); printf(" Enter the function in form a b c d where a<b<c<d."); printf(" Press enter or provide spaces after each input."); printf(" Any value in input function cannot be repeated."); printf(" Enter the select input in form of 1's & 0's."); printf(" All the entered inputs are assumed to be high."); printf(" Maximun value of the minterm that can be accepted :31 "); textcolor(4+BLINK); textbackground(3); cprintf("Press any key to continue......."); textcolor(15); textbackground(0); getch(); printf(" How many input will you provide: "); scanf("%d",&count); if(count>32) { printf(" Invalid function input.inputs can't be greater than 32"); exit(1); } clrscr(); printf("Enter the function to be implemented : "); for(ctr=0;ctr<count;ctr++) { scanf("%d",&function[ctr]); if(function[ctr]>31) { printf(" Invalid function input"); exit(1); } } printf(" Only first %d inputs considered.rest rejected(if any)",count); fflush(stdin); if(function[count-1] <= 1) { two_is_to_one(); common_gui(2); } else if(function[count-1] <= 3) { label1: printf(" Implement using:- 1.)4:1 Mux 2.)2:1 Mux Enter your choice?"); scanf("%d",&choice); switch(choice) { case 1: four_is_to_one(); common_gui(4); break; case 2: complex_two_is_to_one(); common_complex_gui(2); break; default : printf(" Invalid choice"); goto label1; } } else if(function[count-1] <= 7) { label2: printf(" Implement using:- 1.)8:1 Mux 2.)4:1 Mux Enter your choice?"); scanf("%d",&choice); switch(choice) { case 1: eight_is_to_one(); common_gui(8); break; case 2: complex_four_is_to_one(); common_complex_gui(4); break; default : printf(" Invalid choice"); goto label2; } } else if(function[count-1] <= 15) { label3: printf(" Implement using:- 1.)16:1 Mux 2.)8:1 Mux Enter your choice?"); scanf("%d",&choice); switch(choice) { case 1: sixteen_is_to_one(); common_gui(16); break; case 2: complex_eight_is_to_one(); common_complex_gui(8); break; default : printf(" Invalid choice"); goto label3; } } else if(function[count-1] <= 31) { label4: printf(" Implement using:- 1.)32:1 Mux 2.)16:1 Mux Enter your choice?"); scanf("%d",&choice); switch(choice) { case 1: thirtytwo_is_to_one(); common_gui(32); break; case 2: complex_sixteen_is_to_one(); common_complex_gui(16); break; default : printf(" Invalid choice"); goto label4; } } getch(); }