Gates::Gates(string gateName, string gateType){ Gates(); //start with the initial values this->gateName = gateName; StringToUpperCase gateTypeUpperCase (gateType); this->gateType = gateTypeUpperCase.returnUpperCase(); }
int Evaluation(NODE *graph,int Max,int node_id,int value,int f_node,int f_value) { LIST *fanin; int previous,i,res; for(i=0;i<=Max;i++){ graph[i].Mark = 0; // Switch statement to manipulate every node according to their type switch (graph[i].Type) { case INPT : break; // For each gate i pass the fan-in list and take from its members the value //Then i use the respective function to derive the new value of the gate case AND : if (graph[i].Nfi != 0) { fanin = graph[i].Fin; previous = graph[fanin->id].Cval; fanin = fanin->next; while(fanin!=NULL){ previous = Gates(0,graph[fanin->id].Cval,previous); fanin = fanin->next; } graph[i].Cval = previous; } break; case NAND : if (graph[i].Nfi != 0) { fanin = graph[i].Fin; previous = graph[fanin->id].Cval; fanin = fanin->next; while(fanin!=NULL){ previous = Gates(0,graph[fanin->id].Cval,previous); fanin = fanin->next; } graph[i].Cval = NOT_OUT(previous); } break; case OR : if (graph[i].Nfi != 0) { fanin = graph[i].Fin; previous = graph[fanin->id].Cval; fanin = fanin->next; while(fanin!=NULL){ previous = Gates(2,graph[fanin->id].Cval,previous); fanin = fanin->next; } graph[i].Cval = previous; } break; case NOR : if (graph[i].Nfi != 0) { fanin = graph[i].Fin; previous = graph[fanin->id].Cval; fanin = fanin->next; while(fanin!=NULL){ previous = Gates(2,graph[fanin->id].Cval,previous); fanin = fanin->next; } graph[i].Cval = NOT_OUT(previous); } break; case XOR : if (graph[i].Nfi != 0) { fanin = graph[i].Fin; previous = graph[fanin->id].Cval; fanin = fanin->next; while(fanin!=NULL){ previous = Gates(0,Gates(2,NOT_OUT(graph[fanin->id].Cval),previous),Gates(2,graph[fanin->id].Cval,NOT_OUT(previous))); fanin = fanin->next; } graph[i].Cval = previous; } break; case XNOR : if (graph[i].Nfi != 0) { fanin = graph[i].Fin; previous = graph[fanin->id].Cval; fanin = fanin->next; while(fanin!=NULL){ previous = Gates(0,Gates(2,NOT_OUT(graph[fanin->id].Cval),previous),Gates(2,graph[fanin->id].Cval,NOT_OUT(previous))); fanin = fanin->next; } graph[i].Cval = NOT_OUT(previous); } break; case BUFF : if (graph[i].Nfi != 0) { fanin= NULL; fanin = graph[i].Fin; graph[i].Cval = FROM_OUT(graph[fanin->id].Cval); } break; case NOT : if (graph[i].Nfi != 0) { fanin = graph[i].Fin; graph[i].Cval = NOT_OUT(graph[fanin->id].Cval); } break; case FROM : if (graph[i].Nfi != 0) { fanin = graph[i].Fin; graph[i].Cval = FROM_OUT(graph[fanin->id].Cval); } break; } //end case //inject the input if (i == node_id){ graph[i].Cval = value; //printf("i am here\n"); } if(i == f_node){ if(graph[i].Cval == f_value){ if(f_value == 1) graph[i].Cval = 3; else if(f_value == 0) graph[i].Cval = 4; } } } for(i=0;i<=Max;i++){ if(graph[i].Po > 0) if(graph[i].Cval==3 || graph[i].Cval==4){ return 1; } } return 0; }//end of evaluation function