DFFRAM.cc revision 10447
110447Snilay@cs.wisc.edu#include "model/electrical/DFFRAM.h" 210447Snilay@cs.wisc.edu 310447Snilay@cs.wisc.edu#include <cmath> 410447Snilay@cs.wisc.edu 510447Snilay@cs.wisc.edu#include "model/PortInfo.h" 610447Snilay@cs.wisc.edu#include "model/EventInfo.h" 710447Snilay@cs.wisc.edu#include "model/TransitionInfo.h" 810447Snilay@cs.wisc.edu#include "model/timing_graph/ElectricalDriverMultiplier.h" 910447Snilay@cs.wisc.edu#include "model/timing_graph/ElectricalNet.h" 1010447Snilay@cs.wisc.edu#include "model/std_cells/StdCell.h" 1110447Snilay@cs.wisc.edu#include "model/std_cells/StdCellLib.h" 1210447Snilay@cs.wisc.edu#include "model/electrical/Decoder.h" 1310447Snilay@cs.wisc.edu#include "model/electrical/Multiplexer.h" 1410447Snilay@cs.wisc.edu 1510447Snilay@cs.wisc.edunamespace DSENT 1610447Snilay@cs.wisc.edu{ 1710447Snilay@cs.wisc.edu using std::ceil; 1810447Snilay@cs.wisc.edu 1910447Snilay@cs.wisc.edu DFFRAM::DFFRAM(const String& instance_name_, const TechModel* tech_model_) 2010447Snilay@cs.wisc.edu : ElectricalModel(instance_name_, tech_model_) 2110447Snilay@cs.wisc.edu { 2210447Snilay@cs.wisc.edu initParameters(); 2310447Snilay@cs.wisc.edu initProperties(); 2410447Snilay@cs.wisc.edu } 2510447Snilay@cs.wisc.edu 2610447Snilay@cs.wisc.edu DFFRAM::~DFFRAM() 2710447Snilay@cs.wisc.edu {} 2810447Snilay@cs.wisc.edu 2910447Snilay@cs.wisc.edu void DFFRAM::initParameters() 3010447Snilay@cs.wisc.edu { 3110447Snilay@cs.wisc.edu addParameterName("NumberEntries"); 3210447Snilay@cs.wisc.edu addParameterName("NumberBits"); 3310447Snilay@cs.wisc.edu return; 3410447Snilay@cs.wisc.edu } 3510447Snilay@cs.wisc.edu 3610447Snilay@cs.wisc.edu void DFFRAM::initProperties() 3710447Snilay@cs.wisc.edu { 3810447Snilay@cs.wisc.edu return; 3910447Snilay@cs.wisc.edu } 4010447Snilay@cs.wisc.edu 4110447Snilay@cs.wisc.edu DFFRAM* DFFRAM::clone() const 4210447Snilay@cs.wisc.edu { 4310447Snilay@cs.wisc.edu // TODO 4410447Snilay@cs.wisc.edu return NULL; 4510447Snilay@cs.wisc.edu } 4610447Snilay@cs.wisc.edu 4710447Snilay@cs.wisc.edu void DFFRAM::constructModel() 4810447Snilay@cs.wisc.edu { 4910447Snilay@cs.wisc.edu // Get parameters 5010447Snilay@cs.wisc.edu unsigned int number_bits = getParameter("NumberBits").toUInt(); 5110447Snilay@cs.wisc.edu unsigned int number_entries = getParameter("NumberEntries").toUInt(); 5210447Snilay@cs.wisc.edu 5310447Snilay@cs.wisc.edu ASSERT(number_bits > 0, "[Error] " + getInstanceName() + 5410447Snilay@cs.wisc.edu " -> Number of bits must be > 0!"); 5510447Snilay@cs.wisc.edu ASSERT(number_entries > 0, "[Error] " + getInstanceName() + 5610447Snilay@cs.wisc.edu " -> Number of entries must be > 0!"); 5710447Snilay@cs.wisc.edu 5810447Snilay@cs.wisc.edu unsigned int number_addr_bits = (unsigned int)ceil(log2(number_entries)); 5910447Snilay@cs.wisc.edu 6010447Snilay@cs.wisc.edu // Create ports 6110447Snilay@cs.wisc.edu createInputPort("In", makeNetIndex(0, number_bits-1)); 6210447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_addr_bits; ++i) 6310447Snilay@cs.wisc.edu { 6410447Snilay@cs.wisc.edu createInputPort("WRAddr" + (String)i); 6510447Snilay@cs.wisc.edu createInputPort("RDAddr" + (String)i); 6610447Snilay@cs.wisc.edu } 6710447Snilay@cs.wisc.edu createInputPort("WE"); 6810447Snilay@cs.wisc.edu createInputPort("CK"); 6910447Snilay@cs.wisc.edu createOutputPort("Out", makeNetIndex(0, number_bits-1)); 7010447Snilay@cs.wisc.edu 7110447Snilay@cs.wisc.edu // Create energy, power, and area results 7210447Snilay@cs.wisc.edu createElectricalResults(); 7310447Snilay@cs.wisc.edu getEventInfo("Idle")->setStaticTransitionInfos(); 7410447Snilay@cs.wisc.edu getEventInfo("Idle")->setTransitionInfo("CK", TransitionInfo(0.0, 1.0, 0.0)); 7510447Snilay@cs.wisc.edu getEventInfo("Idle")->setTransitionInfo("WE", TransitionInfo(1.0, 0.0, 0.0)); 7610447Snilay@cs.wisc.edu 7710447Snilay@cs.wisc.edu createElectricalEventResult("Read"); 7810447Snilay@cs.wisc.edu getEventInfo("Read")->setTransitionInfo("CK", TransitionInfo(0.0, 1.0, 0.0)); 7910447Snilay@cs.wisc.edu getEventInfo("Read")->setTransitionInfo("WE", TransitionInfo(1.0, 0.0, 0.0)); 8010447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_addr_bits; ++i) 8110447Snilay@cs.wisc.edu { 8210447Snilay@cs.wisc.edu getEventInfo("Read")->setTransitionInfo("WRAddr" + (String)i, TransitionInfo(0.5, 0.0, 0.5)); 8310447Snilay@cs.wisc.edu } 8410447Snilay@cs.wisc.edu createElectricalEventResult("Write"); 8510447Snilay@cs.wisc.edu getEventInfo("Write")->setTransitionInfo("CK", TransitionInfo(0.0, 1.0, 0.0)); 8610447Snilay@cs.wisc.edu getEventInfo("Write")->setTransitionInfo("WE", TransitionInfo(0.0, 0.0, 1.0)); 8710447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_addr_bits; ++i) 8810447Snilay@cs.wisc.edu { 8910447Snilay@cs.wisc.edu getEventInfo("Write")->setTransitionInfo("RDAddr" + (String)i, TransitionInfo(0.5, 0.0, 0.5)); 9010447Snilay@cs.wisc.edu } 9110447Snilay@cs.wisc.edu 9210447Snilay@cs.wisc.edu // Init components - DFF array, Dec, Mux 9310447Snilay@cs.wisc.edu vector<String> dff_names(number_entries, ""); 9410447Snilay@cs.wisc.edu vector<StdCell*> dffs(number_entries, NULL); 9510447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_entries; ++i) 9610447Snilay@cs.wisc.edu { 9710447Snilay@cs.wisc.edu dff_names[i] = "DFF_" + (String)i; 9810447Snilay@cs.wisc.edu dffs[i] = getTechModel()->getStdCellLib()->createStdCell("DFFQ", dff_names[i]); 9910447Snilay@cs.wisc.edu dffs[i]->construct(); 10010447Snilay@cs.wisc.edu } 10110447Snilay@cs.wisc.edu 10210447Snilay@cs.wisc.edu const String& dec_name = "Dec"; 10310447Snilay@cs.wisc.edu Decoder* dec = new Decoder(dec_name, getTechModel()); 10410447Snilay@cs.wisc.edu dec->setParameter("NumberOutputs", number_entries); 10510447Snilay@cs.wisc.edu dec->construct(); 10610447Snilay@cs.wisc.edu 10710447Snilay@cs.wisc.edu const String& mux_name = "Mux"; 10810447Snilay@cs.wisc.edu Multiplexer* mux = new Multiplexer(mux_name, getTechModel()); 10910447Snilay@cs.wisc.edu mux->setParameter("NumberInputs", number_entries); 11010447Snilay@cs.wisc.edu mux->setParameter("NumberBits", 1); 11110447Snilay@cs.wisc.edu mux->setParameter("BitDuplicate", "TRUE"); 11210447Snilay@cs.wisc.edu mux->construct(); 11310447Snilay@cs.wisc.edu 11410447Snilay@cs.wisc.edu // Init components - CK & WE 11510447Snilay@cs.wisc.edu const String& nand2cg0_name = "NAND2_CKGate0"; 11610447Snilay@cs.wisc.edu StdCell* nand2cg0 = getTechModel()->getStdCellLib()->createStdCell("NAND2", nand2cg0_name); 11710447Snilay@cs.wisc.edu nand2cg0->construct(); 11810447Snilay@cs.wisc.edu const String& invcg0_name = "INV_CKGate0"; 11910447Snilay@cs.wisc.edu StdCell* invcg0 = getTechModel()->getStdCellLib()->createStdCell("INV", invcg0_name); 12010447Snilay@cs.wisc.edu invcg0->construct(); 12110447Snilay@cs.wisc.edu 12210447Snilay@cs.wisc.edu // Init components - (CK & WE) & DecOut[i] 12310447Snilay@cs.wisc.edu vector<String> nand2cg1_names(number_entries, ""); 12410447Snilay@cs.wisc.edu vector<StdCell*> nand2cg1s(number_entries, NULL); 12510447Snilay@cs.wisc.edu vector<String> invcg1_names(number_entries, ""); 12610447Snilay@cs.wisc.edu vector<StdCell*> invcg1s(number_entries, NULL); 12710447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_entries; ++i) 12810447Snilay@cs.wisc.edu { 12910447Snilay@cs.wisc.edu nand2cg1_names[i] = "NAND2_CKGate1_" + (String)i; 13010447Snilay@cs.wisc.edu nand2cg1s[i] = getTechModel()->getStdCellLib()->createStdCell("NAND2", nand2cg1_names[i]); 13110447Snilay@cs.wisc.edu nand2cg1s[i]->construct(); 13210447Snilay@cs.wisc.edu 13310447Snilay@cs.wisc.edu invcg1_names[i] = "INV_CKGate1_" + (String)i; 13410447Snilay@cs.wisc.edu invcg1s[i] = getTechModel()->getStdCellLib()->createStdCell("INV", invcg1_names[i]); 13510447Snilay@cs.wisc.edu invcg1s[i]->construct(); 13610447Snilay@cs.wisc.edu } 13710447Snilay@cs.wisc.edu 13810447Snilay@cs.wisc.edu // Connect Decoder 13910447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_addr_bits; ++i) 14010447Snilay@cs.wisc.edu { 14110447Snilay@cs.wisc.edu portConnect(dec, "Addr" + (String)i, "WRAddr" + (String)i); 14210447Snilay@cs.wisc.edu } 14310447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_entries; ++i) 14410447Snilay@cs.wisc.edu { 14510447Snilay@cs.wisc.edu createNet("Dec_Out" + (String)i); 14610447Snilay@cs.wisc.edu portConnect(dec, "Out" + (String)i, "Dec_Out" + (String)i); 14710447Snilay@cs.wisc.edu } 14810447Snilay@cs.wisc.edu 14910447Snilay@cs.wisc.edu // Connect CKGate0 - CK, WE 15010447Snilay@cs.wisc.edu createNet("NAND2_CKGate0_Out"); 15110447Snilay@cs.wisc.edu createNet("CKGate0_Out"); 15210447Snilay@cs.wisc.edu portConnect(nand2cg0, "A", "CK"); 15310447Snilay@cs.wisc.edu portConnect(nand2cg0, "B", "WE"); 15410447Snilay@cs.wisc.edu portConnect(nand2cg0, "Y", "NAND2_CKGate0_Out"); 15510447Snilay@cs.wisc.edu portConnect(invcg0, "A", "NAND2_CKGate0_Out"); 15610447Snilay@cs.wisc.edu portConnect(invcg0, "Y", "CKGate0_Out"); 15710447Snilay@cs.wisc.edu 15810447Snilay@cs.wisc.edu // Connect CKGate1 - CKGate0, Dec_Out 15910447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_entries; ++i) 16010447Snilay@cs.wisc.edu { 16110447Snilay@cs.wisc.edu createNet("NAND2_CKGate1_Outs" + (String)i); 16210447Snilay@cs.wisc.edu createNet("CKGate1_Outs" + (String)i); 16310447Snilay@cs.wisc.edu portConnect(nand2cg1s[i], "A", "CKGate0_Out"); 16410447Snilay@cs.wisc.edu portConnect(nand2cg1s[i], "B", "Dec_Out" + (String)i); 16510447Snilay@cs.wisc.edu portConnect(nand2cg1s[i], "Y", "NAND2_CKGate1_Outs" + (String)i); 16610447Snilay@cs.wisc.edu portConnect(invcg1s[i], "A", "NAND2_CKGate1_Outs" + (String)i); 16710447Snilay@cs.wisc.edu portConnect(invcg1s[i], "Y", "CKGate1_Outs" + (String)i); 16810447Snilay@cs.wisc.edu } 16910447Snilay@cs.wisc.edu 17010447Snilay@cs.wisc.edu // Connect DFF array 17110447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_entries; ++i) 17210447Snilay@cs.wisc.edu { 17310447Snilay@cs.wisc.edu createNet("DFF_Out" + (String)i); 17410447Snilay@cs.wisc.edu for(unsigned int n = 0; n < number_bits; ++n) 17510447Snilay@cs.wisc.edu { 17610447Snilay@cs.wisc.edu portConnect(dffs[i], "D", "In", makeNetIndex(n)); 17710447Snilay@cs.wisc.edu portConnect(dffs[i], "CK", "CKGate1_Outs" + (String)i); 17810447Snilay@cs.wisc.edu } 17910447Snilay@cs.wisc.edu portConnect(dffs[i], "Q", "DFF_Out" + (String)i); 18010447Snilay@cs.wisc.edu } 18110447Snilay@cs.wisc.edu 18210447Snilay@cs.wisc.edu // Connect Multiplexer 18310447Snilay@cs.wisc.edu createNet("Mux_Out"); 18410447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_entries; ++i) 18510447Snilay@cs.wisc.edu { 18610447Snilay@cs.wisc.edu portConnect(mux, "In" + (String)i, "DFF_Out" + (String)i); 18710447Snilay@cs.wisc.edu } 18810447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_addr_bits; ++i) 18910447Snilay@cs.wisc.edu { 19010447Snilay@cs.wisc.edu portConnect(mux, "Sel" + (String)i, "RDAddr" + (String)i); 19110447Snilay@cs.wisc.edu } 19210447Snilay@cs.wisc.edu portConnect(mux, "Out", "Mux_Out"); 19310447Snilay@cs.wisc.edu 19410447Snilay@cs.wisc.edu // Use driver multiplier to connect Mux_Out to Out 19510447Snilay@cs.wisc.edu createDriverMultiplier("OutMult"); 19610447Snilay@cs.wisc.edu ElectricalDriverMultiplier* drive_mult = getDriverMultiplier("OutMult"); 19710447Snilay@cs.wisc.edu getNet("Mux_Out")->addDownstreamNode(drive_mult); 19810447Snilay@cs.wisc.edu for(unsigned int n = 0; n < number_bits; ++n) 19910447Snilay@cs.wisc.edu { 20010447Snilay@cs.wisc.edu drive_mult->addDownstreamNode(getNet("Out", makeNetIndex(n))); 20110447Snilay@cs.wisc.edu } 20210447Snilay@cs.wisc.edu 20310447Snilay@cs.wisc.edu // Add area and power results 20410447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_entries; ++i) 20510447Snilay@cs.wisc.edu { 20610447Snilay@cs.wisc.edu addSubInstances(dffs[i], number_bits); 20710447Snilay@cs.wisc.edu addElectricalSubResults(dffs[i], number_bits); 20810447Snilay@cs.wisc.edu } 20910447Snilay@cs.wisc.edu 21010447Snilay@cs.wisc.edu addSubInstances(dec, 1.0); 21110447Snilay@cs.wisc.edu addElectricalSubResults(dec, 1.0); 21210447Snilay@cs.wisc.edu 21310447Snilay@cs.wisc.edu addSubInstances(mux, number_bits); 21410447Snilay@cs.wisc.edu addElectricalSubResults(mux, number_bits); 21510447Snilay@cs.wisc.edu 21610447Snilay@cs.wisc.edu addSubInstances(nand2cg0, 1.0); 21710447Snilay@cs.wisc.edu addElectricalSubResults(nand2cg0, 1.0); 21810447Snilay@cs.wisc.edu 21910447Snilay@cs.wisc.edu addSubInstances(invcg0, 1); 22010447Snilay@cs.wisc.edu addElectricalSubResults(invcg0, 1.0); 22110447Snilay@cs.wisc.edu 22210447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_entries; ++i) 22310447Snilay@cs.wisc.edu { 22410447Snilay@cs.wisc.edu addSubInstances(nand2cg1s[i], 1); 22510447Snilay@cs.wisc.edu addElectricalSubResults(nand2cg1s[i], 1.0); 22610447Snilay@cs.wisc.edu 22710447Snilay@cs.wisc.edu addSubInstances(invcg1s[i], 1); 22810447Snilay@cs.wisc.edu addElectricalSubResults(invcg1s[i], 1.0); 22910447Snilay@cs.wisc.edu } 23010447Snilay@cs.wisc.edu 23110447Snilay@cs.wisc.edu // Add write event 23210447Snilay@cs.wisc.edu Result* write_event = getEventResult("Write"); 23310447Snilay@cs.wisc.edu write_event->addSubResult(nand2cg0->getEventResult("NAND2"), nand2cg0_name, 1.0); 23410447Snilay@cs.wisc.edu write_event->addSubResult(invcg0->getEventResult("INV"), invcg0_name, 1.0); 23510447Snilay@cs.wisc.edu write_event->addSubResult(dec->getEventResult("Decode"), dec_name, 1.0); 23610447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_entries; ++i) 23710447Snilay@cs.wisc.edu { 23810447Snilay@cs.wisc.edu write_event->addSubResult(nand2cg1s[i]->getEventResult("NAND2"), nand2cg1_names[i], 1.0); 23910447Snilay@cs.wisc.edu write_event->addSubResult(invcg1s[i]->getEventResult("INV"), invcg1_names[i], 1.0); 24010447Snilay@cs.wisc.edu write_event->addSubResult(dffs[i]->getEventResult("DFFD"), dff_names[i], number_bits); 24110447Snilay@cs.wisc.edu write_event->addSubResult(dffs[i]->getEventResult("DFFQ"), dff_names[i], number_bits); 24210447Snilay@cs.wisc.edu write_event->addSubResult(dffs[i]->getEventResult("CK"), dff_names[i], number_bits); 24310447Snilay@cs.wisc.edu } 24410447Snilay@cs.wisc.edu 24510447Snilay@cs.wisc.edu // Add read event 24610447Snilay@cs.wisc.edu Result* read_event = getEventResult("Read"); 24710447Snilay@cs.wisc.edu //for(unsigned int i = 0; i < number_entries; ++i) 24810447Snilay@cs.wisc.edu //{ 24910447Snilay@cs.wisc.edu // read_event->addSubResult(dffs[i]->getEventResult("DFFQ"), dff_names[i], number_bits); 25010447Snilay@cs.wisc.edu //} 25110447Snilay@cs.wisc.edu read_event->addSubResult(mux->getEventResult("Mux"), mux_name, number_bits); 25210447Snilay@cs.wisc.edu 25310447Snilay@cs.wisc.edu return; 25410447Snilay@cs.wisc.edu } 25510447Snilay@cs.wisc.edu 25610447Snilay@cs.wisc.edu void DFFRAM::propagateTransitionInfo() 25710447Snilay@cs.wisc.edu { 25810447Snilay@cs.wisc.edu // Update probability 25910447Snilay@cs.wisc.edu unsigned int number_entries = (unsigned int)getParameter("NumberEntries"); 26010447Snilay@cs.wisc.edu unsigned int number_addr_bits = (unsigned int)ceil(log2(number_entries)); 26110447Snilay@cs.wisc.edu 26210447Snilay@cs.wisc.edu // Update decoder 26310447Snilay@cs.wisc.edu ElectricalModel* dec = (ElectricalModel*)getSubInstance("Dec"); 26410447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_addr_bits; ++i) 26510447Snilay@cs.wisc.edu { 26610447Snilay@cs.wisc.edu propagatePortTransitionInfo(dec, "Addr" + (String)i, "WRAddr" + (String)i); 26710447Snilay@cs.wisc.edu } 26810447Snilay@cs.wisc.edu dec->use(); 26910447Snilay@cs.wisc.edu 27010447Snilay@cs.wisc.edu // Update CKGate0 nands + invs 27110447Snilay@cs.wisc.edu ElectricalModel* nand2cg0 = (ElectricalModel*)getSubInstance("NAND2_CKGate0"); 27210447Snilay@cs.wisc.edu propagatePortTransitionInfo(nand2cg0, "A", "CK"); 27310447Snilay@cs.wisc.edu propagatePortTransitionInfo(nand2cg0, "B", "WE"); 27410447Snilay@cs.wisc.edu nand2cg0->use(); 27510447Snilay@cs.wisc.edu ElectricalModel* invcg0 = (ElectricalModel*)getSubInstance("INV_CKGate0"); 27610447Snilay@cs.wisc.edu propagatePortTransitionInfo(invcg0, "A", nand2cg0, "Y"); 27710447Snilay@cs.wisc.edu invcg0->use(); 27810447Snilay@cs.wisc.edu 27910447Snilay@cs.wisc.edu // Update CKGate1 nands + invs 28010447Snilay@cs.wisc.edu vector<ElectricalModel*> nand2cg1s(number_entries, NULL); 28110447Snilay@cs.wisc.edu vector<ElectricalModel*> invcg1s(number_entries, NULL); 28210447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_entries; ++i) 28310447Snilay@cs.wisc.edu { 28410447Snilay@cs.wisc.edu nand2cg1s[i] = (ElectricalModel*)getSubInstance("NAND2_CKGate1_" + (String)i); 28510447Snilay@cs.wisc.edu propagatePortTransitionInfo(nand2cg1s[i], "A", invcg0, "Y"); 28610447Snilay@cs.wisc.edu propagatePortTransitionInfo(nand2cg1s[i], "B", dec, "Out" + (String)i); 28710447Snilay@cs.wisc.edu nand2cg1s[i]->use(); 28810447Snilay@cs.wisc.edu 28910447Snilay@cs.wisc.edu invcg1s[i] = (ElectricalModel*)getSubInstance("INV_CKGate1_" + (String)i); 29010447Snilay@cs.wisc.edu propagatePortTransitionInfo(invcg1s[i], "A", nand2cg1s[i], "Y"); 29110447Snilay@cs.wisc.edu invcg1s[i]->use(); 29210447Snilay@cs.wisc.edu } 29310447Snilay@cs.wisc.edu 29410447Snilay@cs.wisc.edu // Update DFF 29510447Snilay@cs.wisc.edu vector<ElectricalModel*> dffs(number_entries, NULL); 29610447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_entries; ++i) 29710447Snilay@cs.wisc.edu { 29810447Snilay@cs.wisc.edu dffs[i] = (ElectricalModel*)getSubInstance("DFF_" + (String)i); 29910447Snilay@cs.wisc.edu propagatePortTransitionInfo(dffs[i], "D", "In"); 30010447Snilay@cs.wisc.edu propagatePortTransitionInfo(dffs[i], "CK", invcg1s[i], "Y"); 30110447Snilay@cs.wisc.edu dffs[i]->use(); 30210447Snilay@cs.wisc.edu } 30310447Snilay@cs.wisc.edu 30410447Snilay@cs.wisc.edu // Update Mux 30510447Snilay@cs.wisc.edu ElectricalModel* mux = (ElectricalModel*)getSubInstance("Mux"); 30610447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_entries; ++i) 30710447Snilay@cs.wisc.edu { 30810447Snilay@cs.wisc.edu propagatePortTransitionInfo(mux, "In" + (String)i, dffs[i], "Q"); 30910447Snilay@cs.wisc.edu } 31010447Snilay@cs.wisc.edu for(unsigned int i = 0; i < number_addr_bits; ++i) 31110447Snilay@cs.wisc.edu { 31210447Snilay@cs.wisc.edu propagatePortTransitionInfo(mux, "Sel" + (String)i, "RDAddr" + (String)i); 31310447Snilay@cs.wisc.edu } 31410447Snilay@cs.wisc.edu mux->use(); 31510447Snilay@cs.wisc.edu 31610447Snilay@cs.wisc.edu // Set output probability 31710447Snilay@cs.wisc.edu getOutputPort("Out")->setTransitionInfo(mux->getOutputPort("Out")->getTransitionInfo()); 31810447Snilay@cs.wisc.edu return; 31910447Snilay@cs.wisc.edu } 32010447Snilay@cs.wisc.edu} // namespace DSENT 32110447Snilay@cs.wisc.edu 322