void Circuit::logicSim( Pattern* PatternSet ) { AssignPiValue( PatternSet ); for(unsigned i = 0 ; i < topologicalSequence.size() ; ++i) { int gateID = topologicalSequence[i]; Gate targetGate = gate(gateID); // PI = 1, PO = 2, CUT = 3, CUT_BAR = 4, TIE0 = 5, TIE1 = 6, NORMAL = 7, REMOVED = 8, UNUSED = 0 int finalValue = value[targetGate.inWire(0)]; for(unsigned j = 1 ; j < targetGate.numInWire() ; ++j) { int inWireID = targetGate.inWire(j); //assert(level[wire(inWireID).preGate()] <= level[gateID]); int inValue = value[inWireID]; switch(targetGate.typeID()) { case 1: case 2: finalValue = inValue; break; case 3: case 4: finalValue = finalValue & inValue; break; case 5: case 6: finalValue = finalValue | inValue; break; case 7: case 8: finalValue = finalValue ^ inValue; break; default: cout << "strange gate type id: " << targetGate.typeID() << endl; exit(0); } } switch(targetGate.typeID()) { case 1: case 4: case 6: case 8: finalValue = ~ finalValue; break; default: break; } ///cout<< finalValue<<endl; Wire fanoutWire = wire( targetGate.outWire() ); if( fanoutWire.type() != "CUT" && fanoutWire.type() != "CUT_BAR" ) { wire( targetGate.outWire() ).setValueSet( finalValue ); value[ targetGate.outWire() ] = finalValue; } } return; }
bool Circuit::setLevel() { // read pi vector<int> pi; for(unsigned i = 0 ; i < numWire() ; ++i) { Wire piWire = wire(i); if(piWire.type() == "PI") pi.push_back(i); } // all gate not visit yet queue<int> gates; vector<int> visitCount(numGate() , 0); for(unsigned i = 0 ; i < pi.size() ; ++i) { Wire piWire = wire(pi[i]); // push fanout gates to queue for(unsigned j = 0 ; j < piWire.numPosGate() ; ++j) { int posGateID = piWire.posGate(j); gates.push(posGateID); } } // set level of gates level.assign(numGate() , -1); // visit all gates while(!gates.empty()) { int gateID = gates.front(); gates.pop(); Gate visitedGate = gate(gateID); visitCount[gateID]++; if(visitCount[gateID] != (int)visitedGate.numInWire()) continue; // calculate level int maxSubLevel = 0; for(unsigned i = 0 ; i < visitedGate.numInWire() ; ++i) { Wire inWire = wire(visitedGate.inWire(i)); int preGateID = inWire.preGate(); //cout<< preGateID; maxSubLevel = max(maxSubLevel , level[preGateID]); //cout<<'\t'<< maxSubLevel<<endl; } level[gateID] = maxSubLevel + 1; gate(gateID).setLevel( maxSubLevel +1 ); // push fanout gates to queue Wire outWire = wire(visitedGate.outWire()); for(unsigned j = 0 ; j < outWire.numPosGate() ; ++j) { int posGateID = outWire.posGate(j); gates.push(posGateID); } } // sequence for(unsigned i = 0 ; i < numGate() ; ++i) topologicalSequence.push_back(i); sort(topologicalSequence.begin() , topologicalSequence.end() , levelCompare); if(value.size() == 0) value.assign(numWire() , 0); //if(cutPoint.size() == 0) // cutPoint.assign(numWire() , 0); return true; }