DemuxTreeDeserializer.cc revision 10447
12381SN/A#include "model/electrical/DemuxTreeDeserializer.h" 210694SMarco.Balboni@ARM.com 38949Sandreas.hansson@arm.com#include <cmath> 48949Sandreas.hansson@arm.com 58949Sandreas.hansson@arm.com#include "model/PortInfo.h" 68949Sandreas.hansson@arm.com#include "model/TransitionInfo.h" 78949Sandreas.hansson@arm.com#include "model/EventInfo.h" 88949Sandreas.hansson@arm.com#include "model/std_cells/StdCellLib.h" 98949Sandreas.hansson@arm.com#include "model/std_cells/StdCell.h" 108949Sandreas.hansson@arm.com#include "model/electrical/Multiplexer.h" 118949Sandreas.hansson@arm.com#include "model/timing_graph/ElectricalNet.h" 128949Sandreas.hansson@arm.com 138949Sandreas.hansson@arm.comnamespace DSENT 142592SN/A{ 1510975Sdavid.hashe@amd.com using std::ceil; 162381SN/A 172381SN/A DemuxTreeDeserializer::DemuxTreeDeserializer(const String& instance_name_, const TechModel* tech_model_) 182381SN/A : ElectricalModel(instance_name_, tech_model_) 192381SN/A { 202381SN/A initParameters(); 212381SN/A initProperties(); 222381SN/A } 232381SN/A 242381SN/A DemuxTreeDeserializer::~DemuxTreeDeserializer() 252381SN/A {} 262381SN/A 272381SN/A void DemuxTreeDeserializer::initParameters() 282381SN/A { 292381SN/A addParameterName("InDataRate"); 302381SN/A addParameterName("OutDataRate"); 312381SN/A addParameterName("OutBits"); //Output width will just be output width / serialization ratio 322381SN/A addParameterName("BitDuplicate", "TRUE"); 332381SN/A return; 342381SN/A } 352381SN/A 362381SN/A void DemuxTreeDeserializer::initProperties() 372381SN/A { 382381SN/A return; 392381SN/A } 402665Ssaidi@eecs.umich.edu 412665Ssaidi@eecs.umich.edu DemuxTreeDeserializer* DemuxTreeDeserializer::clone() const 422665Ssaidi@eecs.umich.edu { 432665Ssaidi@eecs.umich.edu // TODO 449031Sandreas.hansson@arm.com return NULL; 452381SN/A } 462381SN/A 472381SN/A void DemuxTreeDeserializer::constructModel() 482381SN/A { 492662Sstever@eecs.umich.edu 502381SN/A // Get parameters 512381SN/A double in_data_rate = getParameter("InDataRate"); 522381SN/A double out_data_rate = getParameter("OutDataRate"); 532381SN/A unsigned int out_bits = getParameter("OutBits"); 542381SN/A bool bit_duplicate = getParameter("BitDuplicate"); 558229Snate@binkert.org 563348Sbinkertn@umich.edu // Calculate deserialization ratio 573348Sbinkertn@umich.edu unsigned int deserialization_ratio = (unsigned int) floor(in_data_rate / out_data_rate); 583348Sbinkertn@umich.edu ASSERT(deserialization_ratio == in_data_rate / out_data_rate, 595735Snate@binkert.org "[Error] " + getInstanceName() + " -> Cannot have non-integer deserialization ratios!"); 604024Sbinkertn@umich.edu ASSERT((deserialization_ratio & (deserialization_ratio - 1)) == 0, 615735Snate@binkert.org "[Error] " + getInstanceName() + " -> Deserialization ratio must be a power of 2"); 623940Ssaidi@eecs.umich.edu 635314Sstever@gmail.com // Calculate output width 646216Snate@binkert.org unsigned int input_bits = out_bits / deserialization_ratio; 652392SN/A ASSERT(out_bits >= deserialization_ratio, "[Error] " + getInstanceName() + 664167Sbinkertn@umich.edu " -> Output width must be >= deserialization ratio!"); 672394SN/A ASSERT(floor((double) out_bits / deserialization_ratio) == input_bits, 688737Skoansin.tan@gmail.com "[Error] " + getInstanceName() + " -> Output width must be a multiple of the serialization ratio!"); 693349Sbinkertn@umich.edu 702394SN/A // Store calculated numbers 712812Srdreslin@umich.edu getGenProperties()->set("DeserializationRatio", deserialization_ratio); 722812Srdreslin@umich.edu getGenProperties()->set("InputBits", input_bits); 734022Sstever@eecs.umich.edu 744022Sstever@eecs.umich.edu // Create ports 755735Snate@binkert.org createInputPort("In", makeNetIndex(0, input_bits-1)); 765735Snate@binkert.org createInputPort("InCK"); 774022Sstever@eecs.umich.edu createOutputPort("Out", makeNetIndex(0, out_bits-1)); 785735Snate@binkert.org 795735Snate@binkert.org //Create energy, power, and area results 805735Snate@binkert.org createElectricalResults(); 814022Sstever@eecs.umich.edu createElectricalEventResult("Deserialize"); 824022Sstever@eecs.umich.edu getEventInfo("Deserialize")->setTransitionInfo("InCK", TransitionInfo(0.0, (double) deserialization_ratio / 2.0, 0.0)); 834022Sstever@eecs.umich.edu // Set conditions during idle state 844022Sstever@eecs.umich.edu getEventInfo("Idle")->setStaticTransitionInfos(); 854473Sstever@eecs.umich.edu getEventInfo("Idle")->setTransitionInfo("InCK", TransitionInfo(0.0, (double) deserialization_ratio / 2.0, 0.0)); 865319Sstever@gmail.com 874022Sstever@eecs.umich.edu // Mark InCK as a false path (since timing tool will do strange stuff due to all the clock divides and stuff) 884022Sstever@eecs.umich.edu getNet("InCK")->setFalsePath(true); 894022Sstever@eecs.umich.edu 9010883Sali.jafri@arm.com // Create deserializer 914022Sstever@eecs.umich.edu if (deserialization_ratio == 1) 924022Sstever@eecs.umich.edu { 934022Sstever@eecs.umich.edu // No need to do anything, hohoho 944022Sstever@eecs.umich.edu assign("Out", "In"); 9510886Sandreas.hansson@arm.com } 964022Sstever@eecs.umich.edu else if (input_bits == 1) 977465Ssteve.reinhardt@amd.com { 984628Sstever@eecs.umich.edu //----------------------------------------------------------------- 997465Ssteve.reinhardt@amd.com // Create 2:1 demux deserializer 1007465Ssteve.reinhardt@amd.com //----------------------------------------------------------------- 1014022Sstever@eecs.umich.edu const String& des_dff_way0_name = "DesDFFWay0"; 1024022Sstever@eecs.umich.edu const String& des_dff_way1_name = "DesDFFWay1"; 10310885Sandreas.hansson@arm.com const String& des_latch_name = "DesLatch"; 10410885Sandreas.hansson@arm.com const String& ck_dff_name = "CKDFF"; 1054626Sstever@eecs.umich.edu const String& ck_inv_name = "CKINV"; 1064626Sstever@eecs.umich.edu const String& out_way0_name = "OutWay0"; 1077669Ssteve.reinhardt@amd.com const String& out_way1_name = "OutWay1"; 1084626Sstever@eecs.umich.edu const String& mid_way0_name = "MidWay0"; 1094040Ssaidi@eecs.umich.edu const String& ck_div2_name = "CK_div2"; 1104040Ssaidi@eecs.umich.edu const String& ck_div2_b_name = "CK_div2_b"; 1115650Sgblack@eecs.umich.edu 1125650Sgblack@eecs.umich.edu // Create nets 11310975Sdavid.hashe@amd.com createNet(out_way0_name); 11410975Sdavid.hashe@amd.com createNet(out_way1_name); 11510975Sdavid.hashe@amd.com createNet(mid_way0_name); 11610975Sdavid.hashe@amd.com createNet(ck_div2_name); 1174870Sstever@eecs.umich.edu createNet(ck_div2_b_name); 1184870Sstever@eecs.umich.edu 1194870Sstever@eecs.umich.edu // Create the dffs and latch needed on both ways 1204870Sstever@eecs.umich.edu StdCell* des_dff_way0 = getTechModel()->getStdCellLib()->createStdCell("DFFQ", des_dff_way0_name); 1214870Sstever@eecs.umich.edu des_dff_way0->construct(); 1224870Sstever@eecs.umich.edu StdCell* des_dff_way1 = getTechModel()->getStdCellLib()->createStdCell("DFFQ", des_dff_way1_name); 1238436SBrad.Beckmann@amd.com des_dff_way1->construct(); 1248436SBrad.Beckmann@amd.com StdCell* des_latch = getTechModel()->getStdCellLib()->createStdCell("LATQ", des_latch_name); 1255314Sstever@gmail.com des_latch->construct(); 1265314Sstever@gmail.com 1278184Ssomayeh@cs.wisc.edu // Create clk divide circuit 12810886Sandreas.hansson@arm.com StdCell* ck_dff = getTechModel()->getStdCellLib()->createStdCell("DFFQ", ck_dff_name); 12910886Sandreas.hansson@arm.com ck_dff->construct(); 1304022Sstever@eecs.umich.edu StdCell* ck_inv = getTechModel()->getStdCellLib()->createStdCell("INV", ck_inv_name); 1314022Sstever@eecs.umich.edu ck_inv->construct(); 1324022Sstever@eecs.umich.edu 1334022Sstever@eecs.umich.edu // Connect ports 1345735Snate@binkert.org portConnect(des_dff_way0, "CK", "InCK"); 1355735Snate@binkert.org portConnect(des_dff_way0, "D", mid_way0_name); 1365735Snate@binkert.org portConnect(des_dff_way0, "Q", out_way0_name); 1374022Sstever@eecs.umich.edu portConnect(des_latch, "G", "InCK"); 1384022Sstever@eecs.umich.edu portConnect(des_latch, "D", "In"); 1394626Sstever@eecs.umich.edu portConnect(des_latch, "Q", mid_way0_name); 1404626Sstever@eecs.umich.edu portConnect(des_dff_way1, "CK", "InCK"); 1417465Ssteve.reinhardt@amd.com portConnect(des_dff_way1, "D", "In"); 1424022Sstever@eecs.umich.edu portConnect(des_dff_way1, "Q", out_way1_name); 1434626Sstever@eecs.umich.edu portConnect(ck_dff, "CK", "InCK"); 1444626Sstever@eecs.umich.edu portConnect(ck_dff, "D", ck_div2_b_name); 1454626Sstever@eecs.umich.edu portConnect(ck_dff, "Q", ck_div2_name); 1464626Sstever@eecs.umich.edu portConnect(ck_inv, "A", ck_div2_name); 1474022Sstever@eecs.umich.edu portConnect(ck_inv, "Y", ck_div2_b_name); 1484022Sstever@eecs.umich.edu 1496076Sgblack@eecs.umich.edu // Add sub instances 1504626Sstever@eecs.umich.edu addSubInstances(des_dff_way0, 1.0); 1514870Sstever@eecs.umich.edu addElectricalSubResults(des_dff_way0, 1.0); 1525314Sstever@gmail.com addSubInstances(des_dff_way1, 1.0); 1538184Ssomayeh@cs.wisc.edu addElectricalSubResults(des_dff_way1, 1.0); 1544022Sstever@eecs.umich.edu addSubInstances(des_latch, 1.0); 1554022Sstever@eecs.umich.edu addElectricalSubResults(des_latch, 1.0); 1564022Sstever@eecs.umich.edu addSubInstances(ck_dff, 1.0); 1575735Snate@binkert.org addElectricalSubResults(ck_dff, 1.0); 1585735Snate@binkert.org addSubInstances(ck_inv, 1.0); 1595735Snate@binkert.org addElectricalSubResults(ck_inv, 1.0); 1605735Snate@binkert.org 1615735Snate@binkert.org Result* deserialize = getEventResult("Deserialize"); 1625735Snate@binkert.org deserialize->addSubResult(des_dff_way0->getEventResult("CK"), des_dff_way0_name, 1.0); 1635735Snate@binkert.org deserialize->addSubResult(des_dff_way0->getEventResult("DFFD"), des_dff_way0_name, 1.0); 1644022Sstever@eecs.umich.edu deserialize->addSubResult(des_dff_way0->getEventResult("DFFQ"), des_dff_way0_name, 1.0); 1655735Snate@binkert.org deserialize->addSubResult(des_dff_way1->getEventResult("CK"), des_dff_way1_name, 1.0); 1665735Snate@binkert.org deserialize->addSubResult(des_dff_way1->getEventResult("DFFD"), des_dff_way1_name, 1.0); 1674022Sstever@eecs.umich.edu deserialize->addSubResult(des_dff_way1->getEventResult("DFFQ"), des_dff_way1_name, 1.0); 1685735Snate@binkert.org deserialize->addSubResult(des_latch->getEventResult("G"), des_latch_name, 1.0); 1694022Sstever@eecs.umich.edu deserialize->addSubResult(des_latch->getEventResult("LATD"), des_latch_name, 1.0); 1704022Sstever@eecs.umich.edu deserialize->addSubResult(des_latch->getEventResult("LATQ"), des_latch_name, 1.0); 1714022Sstever@eecs.umich.edu deserialize->addSubResult(ck_dff->getEventResult("CK"), ck_dff_name, 1.0); 1725735Snate@binkert.org deserialize->addSubResult(ck_dff->getEventResult("DFFD"), ck_dff_name, 1.0); 1734022Sstever@eecs.umich.edu deserialize->addSubResult(ck_dff->getEventResult("DFFQ"), ck_dff_name, 1.0); 1744022Sstever@eecs.umich.edu deserialize->addSubResult(ck_inv->getEventResult("INV"), ck_inv_name, 1.0); 1754022Sstever@eecs.umich.edu //----------------------------------------------------------------- 1764022Sstever@eecs.umich.edu 1774022Sstever@eecs.umich.edu //----------------------------------------------------------------- 1784022Sstever@eecs.umich.edu // Create Sub-deserializers 1795735Snate@binkert.org //----------------------------------------------------------------- 1805735Snate@binkert.org // Create sub-deserializers 1815735Snate@binkert.org const String& demux_way0_name = "DemuxTree_way0_" + (String) deserialization_ratio + "_to_1"; 1824022Sstever@eecs.umich.edu const String& demux_way1_name = "DemuxTree_way1_" + (String) deserialization_ratio + "_to_1"; 1834022Sstever@eecs.umich.edu 1844022Sstever@eecs.umich.edu DemuxTreeDeserializer* demux_way0 = new DemuxTreeDeserializer(demux_way0_name, getTechModel()); 1854022Sstever@eecs.umich.edu demux_way0->setParameter("InDataRate", in_data_rate / 2.0); 1864022Sstever@eecs.umich.edu demux_way0->setParameter("OutDataRate", out_data_rate); 18710583SCurtis.Dunham@arm.com demux_way0->setParameter("OutBits", out_bits / 2); 18810583SCurtis.Dunham@arm.com demux_way0->setParameter("BitDuplicate", "TRUE"); 18910583SCurtis.Dunham@arm.com demux_way0->construct(); 19010583SCurtis.Dunham@arm.com 19110583SCurtis.Dunham@arm.com DemuxTreeDeserializer* demux_way1 = new DemuxTreeDeserializer(demux_way1_name, getTechModel()); 19210583SCurtis.Dunham@arm.com demux_way1->setParameter("InDataRate", in_data_rate / 2.0); 19310583SCurtis.Dunham@arm.com demux_way1->setParameter("OutDataRate", out_data_rate); 19410583SCurtis.Dunham@arm.com demux_way1->setParameter("OutBits", out_bits / 2); 19510570Sandreas.hansson@arm.com demux_way1->setParameter("BitDuplicate", "TRUE"); 19610570Sandreas.hansson@arm.com demux_way1->construct(); 19710570Sandreas.hansson@arm.com 19810570Sandreas.hansson@arm.com // Connect ports 19910570Sandreas.hansson@arm.com portConnect(demux_way0, "In", out_way0_name); 20010570Sandreas.hansson@arm.com portConnect(demux_way0, "InCK", ck_div2_name); 2014022Sstever@eecs.umich.edu portConnect(demux_way0, "Out", "Out", makeNetIndex(0, out_bits/2-1)); 2026102Sgblack@eecs.umich.edu 20310343SCurtis.Dunham@arm.com portConnect(demux_way1, "In", out_way1_name); 20410343SCurtis.Dunham@arm.com portConnect(demux_way1, "InCK", ck_div2_name); 20510343SCurtis.Dunham@arm.com portConnect(demux_way1, "Out", "Out", makeNetIndex(out_bits/2, out_bits-1)); 20610343SCurtis.Dunham@arm.com 2074870Sstever@eecs.umich.edu // Add subinstances and area results 2085314Sstever@gmail.com addSubInstances(demux_way0, 1.0); 2098184Ssomayeh@cs.wisc.edu addElectricalSubResults(demux_way0, 1.0); 2104022Sstever@eecs.umich.edu addSubInstances(demux_way1, 1.0); 2115735Snate@binkert.org addElectricalSubResults(demux_way1, 1.0); 2125735Snate@binkert.org 2135735Snate@binkert.org deserialize->addSubResult(demux_way0->getEventResult("Deserialize"), demux_way0_name, 1.0); 2144022Sstever@eecs.umich.edu deserialize->addSubResult(demux_way1->getEventResult("Deserialize"), demux_way1_name, 1.0); 2154022Sstever@eecs.umich.edu //----------------------------------------------------------------- 2164022Sstever@eecs.umich.edu 2175735Snate@binkert.org } 2185735Snate@binkert.org else if (bit_duplicate) 2194022Sstever@eecs.umich.edu { 2204022Sstever@eecs.umich.edu const String& demux_name = "DemuxTree_" + (String) deserialization_ratio + "_to_1"; 2215735Snate@binkert.org 2225735Snate@binkert.org DemuxTreeDeserializer* des_bit = new DemuxTreeDeserializer(demux_name, getTechModel()); 2235735Snate@binkert.org des_bit->setParameter("InDataRate", in_data_rate); 2244022Sstever@eecs.umich.edu des_bit->setParameter("OutDataRate", out_data_rate); 2255735Snate@binkert.org des_bit->setParameter("OutBits", deserialization_ratio); 2265735Snate@binkert.org des_bit->setParameter("BitDuplicate", "TRUE"); 2274022Sstever@eecs.umich.edu des_bit->construct(); 2284022Sstever@eecs.umich.edu 2292381SN/A // Create VFI and VFO nets 2302662Sstever@eecs.umich.edu createNet("InVFI"); 2312662Sstever@eecs.umich.edu createNet("OutVFO", makeNetIndex(0, deserialization_ratio-1)); 2322662Sstever@eecs.umich.edu 2332662Sstever@eecs.umich.edu // Connect ports 2342662Sstever@eecs.umich.edu portConnect(des_bit, "In", "InVFI"); 2352381SN/A portConnect(des_bit, "Out", "OutVFO"); 2369044SAli.Saidi@ARM.com 2372381SN/A // Do VFI and VFO 2382813Srdreslin@umich.edu assignVirtualFanin("InVFI", "In"); 2395735Snate@binkert.org for (unsigned int i = 0; i < input_bits; ++i) 2405735Snate@binkert.org { 2414022Sstever@eecs.umich.edu portConnect(des_bit, "InCK", "InCK"); 2425735Snate@binkert.org for (unsigned int j = 0; j < deserialization_ratio; ++j) 2435735Snate@binkert.org assignVirtualFanout("Out", makeNetIndex(i*deserialization_ratio + j), "OutVFO", makeNetIndex(j)); 24410938Sandreas.hansson@arm.com } 24510938Sandreas.hansson@arm.com // Add subinstances and area results 24610938Sandreas.hansson@arm.com addSubInstances(des_bit, input_bits); 24710938Sandreas.hansson@arm.com addElectricalSubResults(des_bit, input_bits); 24810938Sandreas.hansson@arm.com getEventResult("Deserialize")->addSubResult(des_bit->getEventResult("Deserialize"), demux_name, input_bits); 24910938Sandreas.hansson@arm.com } 25010938Sandreas.hansson@arm.com else 25110938Sandreas.hansson@arm.com { 25210938Sandreas.hansson@arm.com //Instantiate a bunch of 1 input bit deserializers 25310938Sandreas.hansson@arm.com for (unsigned int i = 0; i < input_bits; ++i) 25410938Sandreas.hansson@arm.com { 25510938Sandreas.hansson@arm.com const String& demux_name = "DemuxTree_" + (String) deserialization_ratio + "_to_1_bit" + (String) i; 25610938Sandreas.hansson@arm.com 25710938Sandreas.hansson@arm.com DemuxTreeDeserializer* des_bit = new DemuxTreeDeserializer(demux_name, getTechModel()); 25811057Sandreas.hansson@arm.com des_bit->setParameter("InDataRate", in_data_rate); 25911057Sandreas.hansson@arm.com des_bit->setParameter("OutDataRate", out_data_rate); 26011057Sandreas.hansson@arm.com des_bit->setParameter("OutBits", deserialization_ratio); 26111057Sandreas.hansson@arm.com des_bit->setParameter("BitDuplicate", "TRUE"); 26210938Sandreas.hansson@arm.com des_bit->construct(); 26310938Sandreas.hansson@arm.com 26410938Sandreas.hansson@arm.com portConnect(des_bit, "In", "In", makeNetIndex(i)); 26510938Sandreas.hansson@arm.com portConnect(des_bit, "InCK", "InCK"); 26610938Sandreas.hansson@arm.com portConnect(des_bit, "Out", "Out", makeNetIndex(i*deserialization_ratio, (i+1)*deserialization_ratio-1)); 26710938Sandreas.hansson@arm.com 26810938Sandreas.hansson@arm.com addSubInstances(des_bit, 1.0); 26910938Sandreas.hansson@arm.com addElectricalSubResults(des_bit, 1.0); 27010938Sandreas.hansson@arm.com getEventResult("Deserialize")->addSubResult(des_bit->getEventResult("Deserialize"), demux_name, 1.0); 27110938Sandreas.hansson@arm.com } 27210938Sandreas.hansson@arm.com } 27310938Sandreas.hansson@arm.com 27410938Sandreas.hansson@arm.com return; 27510938Sandreas.hansson@arm.com } 27610938Sandreas.hansson@arm.com 27710938Sandreas.hansson@arm.com void DemuxTreeDeserializer::propagateTransitionInfo() 2785735Snate@binkert.org { 2795735Snate@binkert.org // Get parameters 2805735Snate@binkert.org bool bit_duplicate = getParameter("BitDuplicate"); 2815735Snate@binkert.org // Get generated properties 2824022Sstever@eecs.umich.edu unsigned int deserialization_ratio = getGenProperties()->get("DeserializationRatio"); 2834022Sstever@eecs.umich.edu unsigned int input_bits = getGenProperties()->get("InputBits"); 2845735Snate@binkert.org 2854870Sstever@eecs.umich.edu // Calculate output transitions and activities 2864870Sstever@eecs.umich.edu if (deserialization_ratio == 1) 2875735Snate@binkert.org { 28810569Sandreas.hansson@arm.com // If no deserialization, then just propagate input transition info to output port 2894870Sstever@eecs.umich.edu propagatePortTransitionInfo("Out", "In"); 2902566SN/A } 2915735Snate@binkert.org else if (input_bits == 1) 2925735Snate@binkert.org { 2935735Snate@binkert.org const String& des_dff_way0_name = "DesDFFWay0"; 2945735Snate@binkert.org const String& des_dff_way1_name = "DesDFFWay1"; 2955735Snate@binkert.org const String& des_latch_name = "DesLatch"; 2965735Snate@binkert.org const String& ck_dff_name = "CKDFF"; 2972566SN/A const String& ck_inv_name = "CKINV"; 2982566SN/A 2992566SN/A // Sub-deserializer names 3005735Snate@binkert.org const String& demux_way0_name = "DemuxTree_way0_" + (String) deserialization_ratio + "_to_1"; 3015735Snate@binkert.org const String& demux_way1_name = "DemuxTree_way1_" + (String) deserialization_ratio + "_to_1"; 3022381SN/A 3032381SN/A // Update transition info for deserialization registers/latches 30410028SGiacomo.Gabrielli@arm.com ElectricalModel* des_latch = (ElectricalModel*) getSubInstance(des_latch_name); 30510028SGiacomo.Gabrielli@arm.com propagatePortTransitionInfo(des_latch, "G", "InCK"); 30610028SGiacomo.Gabrielli@arm.com propagatePortTransitionInfo(des_latch, "D", "In"); 3075735Snate@binkert.org des_latch->use(); 3086227Snate@binkert.org 3092381SN/A ElectricalModel* des_dff_way0 = (ElectricalModel*) getSubInstance(des_dff_way0_name); 3105735Snate@binkert.org propagatePortTransitionInfo(des_dff_way0, "CK", "InCK"); 31110723Sandreas.hansson@arm.com propagatePortTransitionInfo(des_dff_way0, "D", des_latch, "Q"); 3128668Sgeoffrey.blake@arm.com des_dff_way0->use(); 31310723Sandreas.hansson@arm.com 3148668Sgeoffrey.blake@arm.com ElectricalModel* des_dff_way1 = (ElectricalModel*) getSubInstance(des_dff_way1_name); 3152641Sstever@eecs.umich.edu propagatePortTransitionInfo(des_dff_way1, "CK", "InCK"); 3162811Srdreslin@umich.edu propagatePortTransitionInfo(des_dff_way1, "D", "In"); 3179547Sandreas.hansson@arm.com des_dff_way1->use(); 31810694SMarco.Balboni@ARM.com 31910405Sandreas.hansson@arm.com // Get input transitions of input clock 32010405Sandreas.hansson@arm.com double P01_CK = getInputPort("InCK")->getTransitionInfo().getNumberTransitions01(); 32110405Sandreas.hansson@arm.com // Update transition info for clk division DFF 32210405Sandreas.hansson@arm.com ElectricalModel* ck_dff = (ElectricalModel*) getSubInstance(ck_dff_name); 3239547Sandreas.hansson@arm.com propagatePortTransitionInfo(ck_dff, "CK", "InCK"); 32410694SMarco.Balboni@ARM.com // Since it is a clock divider, P01 is D and Q are simply half the P01 of D and Q of 3253218Sgblack@eecs.umich.edu // the input clock 3269547Sandreas.hansson@arm.com if (P01_CK != 0) ck_dff->getInputPort("D")->setTransitionInfo(TransitionInfo(0.0, P01_CK * 0.5, 0.0)); 32710694SMarco.Balboni@ARM.com else ck_dff->getInputPort("D")->setTransitionInfo(TransitionInfo(0.5, 0.0, 0.5)); 32810694SMarco.Balboni@ARM.com 32910694SMarco.Balboni@ARM.com ck_dff->use(); 33010694SMarco.Balboni@ARM.com // Update transition info of clk divided inverter 33110405Sandreas.hansson@arm.com ElectricalModel* ck_inv = (ElectricalModel*) getSubInstance(ck_inv_name); 33210405Sandreas.hansson@arm.com propagatePortTransitionInfo(ck_inv, "A", ck_dff, "Q"); 3339547Sandreas.hansson@arm.com ck_inv->use(); 33410694SMarco.Balboni@ARM.com 3353218Sgblack@eecs.umich.edu // Update transition info for next demux stages 3365735Snate@binkert.org ElectricalModel* demux_way0 = (ElectricalModel*) getSubInstance(demux_way0_name); 3375735Snate@binkert.org propagatePortTransitionInfo(demux_way0, "In", des_dff_way0, "Q"); 3389542Sandreas.hansson@arm.com propagatePortTransitionInfo(demux_way0, "InCK", ck_dff, "Q"); 3399542Sandreas.hansson@arm.com demux_way0->use(); 3409542Sandreas.hansson@arm.com ElectricalModel* demux_way1 = (ElectricalModel*) getSubInstance(demux_way1_name); 3419542Sandreas.hansson@arm.com propagatePortTransitionInfo(demux_way1, "In", des_dff_way1, "Q"); 3429542Sandreas.hansson@arm.com propagatePortTransitionInfo(demux_way1, "InCK", ck_dff, "Q"); 3439542Sandreas.hansson@arm.com demux_way1->use(); 3449542Sandreas.hansson@arm.com 3459542Sandreas.hansson@arm.com propagatePortTransitionInfo("Out", demux_way0, "Out"); 3469542Sandreas.hansson@arm.com } 3479542Sandreas.hansson@arm.com else if (bit_duplicate) 3489542Sandreas.hansson@arm.com { 3499542Sandreas.hansson@arm.com // Propagate transition info 3509542Sandreas.hansson@arm.com const String& demux_name = "DemuxTree_" + (String) deserialization_ratio + "_to_1"; 3519542Sandreas.hansson@arm.com ElectricalModel* demux = (ElectricalModel*) getSubInstance(demux_name); 3525735Snate@binkert.org propagatePortTransitionInfo(demux, "In", "In"); 3535735Snate@binkert.org propagatePortTransitionInfo(demux, "InCK", "InCK"); 3545735Snate@binkert.org demux->use(); 3559542Sandreas.hansson@arm.com 3569542Sandreas.hansson@arm.com propagatePortTransitionInfo("Out", demux, "Out"); 3572641Sstever@eecs.umich.edu } 3582641Sstever@eecs.umich.edu else 3592641Sstever@eecs.umich.edu { 3605315Sstever@gmail.com // Set output probability to be average that of probabilties of each output bit 3615315Sstever@gmail.com // Update all 1 bit deserializers 3625315Sstever@gmail.com for (unsigned int i = 0; i < input_bits; ++i) 3635315Sstever@gmail.com { 3649044SAli.Saidi@ARM.com const String& demux_name = "DemuxTree_" + (String) deserialization_ratio + "_to_1_bit" + (String) i; 3655735Snate@binkert.org ElectricalModel* demux_bit = (ElectricalModel*) getSubInstance(demux_name); 3665735Snate@binkert.org propagatePortTransitionInfo(demux_bit, "In", "In"); 3675735Snate@binkert.org propagatePortTransitionInfo(demux_bit, "InCK", "InCK"); 3685735Snate@binkert.org demux_bit->use(); 3695735Snate@binkert.org 3705735Snate@binkert.org propagatePortTransitionInfo("Out", demux_bit, "Out"); 3715735Snate@binkert.org } 3725314Sstever@gmail.com } 3735314Sstever@gmail.com 3745314Sstever@gmail.com return; 3755735Snate@binkert.org } 3765314Sstever@gmail.com 3775314Sstever@gmail.com} // namespace DSENT 3785314Sstever@gmail.com 3795314Sstever@gmail.com