int Circuit::createFullAdder(Node* input1, Node* input2, Node* cin, Node* output, Node* cout) { assert(input1 != NULL); assert(input2 != NULL); assert(cin != NULL); assert(output != NULL); assert(cout != NULL); output->clearTT(); output->clearFanin(); cout->clearTT(); cout->clearFanin(); // sum bit createXOR3Node(input1, input2, cin, output); // carry out bit cout->addFanin(input1); cout->addFanin(input2); cout->addFanin(cin); cout->tt.setNumVars(3); cout->tt.addEntry("011"); cout->tt.addEntry("101"); cout->tt.addEntry("110"); cout->tt.addEntry("111"); return 0; }
int Circuit::createSUBModule(const string &input1, const string &input2, const string &output, unsigned int numBits) { Node* node; // create input nodes for (unsigned int i = 0; i < numBits; ++i) { stringstream sstr; sstr << i; string name = input1 + "[" + sstr.str() + "]"; node = createNode(name); } for (unsigned int i = 0; i < numBits; ++i) { stringstream sstr; sstr << i; string name = input2 + "[" + sstr.str() + "]"; node = createNode(name); } // create output nodes for (unsigned int i = 0; i < numBits; ++i) { stringstream sstr; sstr << i; string name = output + "[" + sstr.str() + "]"; node = createNode(name); } // create one node and zero node Node* zeroNode = createNode("ZERO"); createZERONode(zeroNode); Node* oneNode = createNode("ONE"); createONENode(oneNode); // create c_out node Node* c_out = createNode("cout"); // create internal1 nodes for (unsigned int i = 0; i < numBits; ++i) { stringstream sstr; sstr << i; string name = output+"h"; name = name + "[" + sstr.str() + "]"; node = createNode(name); } // inverse the input2 for (unsigned int i = 0; i < numBits; ++i) { stringstream sstr; sstr << i; string name = output +"h"; name = name + "[" + sstr.str() + "]"; Node* hh = findNode(name); assert(hh != NULL); name = input2 + "[" + sstr.str() + "]"; Node* inNode2 = findNode(name); assert(inNode2 != NULL); createXOR3Node(zeroNode, oneNode, inNode2, hh); } // add input1 and the complemented input2 createADDModule(input1, output+"h", "ONE", output, "cout" ,numBits); // when you have implemented this function, // change 'return -1' to 'return 0' return 0; }
int Circuit::createADDModule(const string &input1, const string &input2, const string &cin, const string &output, const string &cout, unsigned int numBits) { Node* node; // create input1 and input2 nodes for (unsigned int i = 0; i < numBits; ++i) { stringstream sstr; sstr << i; string name = input1 + "[" + sstr.str() + "]"; node = createNode(name); } for (unsigned int i = 0; i < numBits; ++i) { stringstream sstr; sstr << i; string name = input2 + "[" + sstr.str() + "]"; node = createNode(name); } // create cin node node = createNode(cin); // create output nodes for (unsigned int i = 0; i < numBits; ++i) { stringstream sstr; sstr << i; string name = output + "[" + sstr.str() + "]"; node = createNode(name); } // create cout node = createNode(cout); // create internal nodes C for (unsigned int i = 0; i < numBits; ++i) { stringstream sstr; sstr << i; string name = output+"c" ; name = name + "[" + sstr.str() + "]"; node = createNode(name); } // create other internal nodes d, f, g, c for (unsigned int i = 0; i < numBits; ++i) { stringstream sstr; sstr << i; string name = output+"d" ; name = name + "[" + sstr.str() + "]"; node = createNode(name); } for (unsigned int i = 0; i < numBits; ++i) { stringstream sstr; sstr << i; string name = output+"e" ; name = name + "[" + sstr.str() + "]"; node = createNode(name); } for (unsigned int i = 0; i < numBits; ++i) { stringstream sstr; sstr << i; string name = output+"f" ; name = name + "[" + sstr.str() + "]"; node = createNode(name); } for (unsigned int i = 0; i < numBits; ++i) { stringstream sstr; sstr << i; string name = output+"g" ; name = name + "[" + sstr.str() + "]"; node = createNode(name); } for (unsigned int i = 0; i < numBits; ++i) { Node* internal_c_previous; if(i!=0) { stringstream sstr; sstr << i-1; string name = output+"c"; name = name + "[" + sstr.str() + "]"; internal_c_previous = findNode(name); assert(internal_c_previous != NULL); } stringstream sstr; sstr << i; string name = output + "[" + sstr.str() + "]"; Node* outNode = findNode(name); assert(outNode != NULL); name = input1 + "[" + sstr.str() + "]"; Node* inNode1 = findNode(name); assert(inNode1 != NULL); name = input2 + "[" + sstr.str() + "]"; Node* inNode2 = findNode(name); assert(inNode2 != NULL); //internal node for c(n-1) to c0 name = output+"c"; name = name + "[" + sstr.str() + "]"; Node* internal_c = findNode(name); assert(internal_c != NULL); //internal node1 name = output+"d"; name = name + "[" + sstr.str() + "]"; Node* dd = findNode(name); assert(dd != NULL); //internal node2 name = output+"e"; name = name + "[" + sstr.str() + "]"; Node* ee = findNode(name); assert(ee != NULL); //internal node3 name = output+"f"; name = name + "[" + sstr.str() + "]"; Node* ff = findNode(name); assert(ff != NULL); //internal node4 name = output+"g"; name = name + "[" + sstr.str() + "]"; Node* gg = findNode(name); assert(gg != NULL); Node* c_in = findNode(cin); assert(c_in != NULL); Node* c_out = findNode(cout); assert(c_out != NULL); //To calculate each bit of the adder if (i==0) { //s0=a0^b0^cin; createXOR3Node(inNode1, inNode2, c_in, outNode); //c0=a0*b0+b0*cin+cin*a0; createAND2Node(inNode1,inNode2,dd); createAND2Node(inNode1,c_in,ee); createAND2Node(inNode2,c_in,ff); createOR2Node(dd,ee,gg); createOR2Node(gg,ff,internal_c); } else if ( i==(numBits-1) ) { //sn=an^bn^c(n-1); createXOR3Node(inNode1, inNode2, internal_c_previous, outNode); //cn=an*bn+bn*c(n-1)+c(n-1)*an; createAND2Node(inNode1,inNode2,dd); createAND2Node(inNode1,internal_c_previous,ee); createAND2Node(inNode2,internal_c_previous,ff); createOR2Node(dd,ee,gg); createOR2Node(gg,ff,c_out); } else { //sk=ak^bk^c(k-1); createXOR3Node(inNode1, inNode2, internal_c_previous, outNode); //ck=ak*bk+bk*c(k-1)+c(k-1)*ak; createAND2Node(inNode1,inNode2,dd); createAND2Node(inNode1,internal_c_previous,ee); createAND2Node(inNode2,internal_c_previous,ff); createOR2Node(dd,ee,gg); createOR2Node(gg,ff,internal_c); } } // when you have implemented this function, // change 'return -1' to 'return 0' return 0; }