Exemplo n.º 1
0
Gates::Gates(string gateName, string gateType){
  Gates(); //start with the initial values
  this->gateName = gateName;
  StringToUpperCase gateTypeUpperCase (gateType);
  this->gateType = gateTypeUpperCase.returnUpperCase();
}
Exemplo n.º 2
0
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