DemuxTreeDeserializer.cc revision 10447:a465576671d4
12292SN/A#include "model/electrical/DemuxTreeDeserializer.h" 213590Srekai.gonzalezalberquilla@arm.com 39444SAndreas.Sandberg@ARM.com#include <cmath> 49444SAndreas.Sandberg@ARM.com 59444SAndreas.Sandberg@ARM.com#include "model/PortInfo.h" 69444SAndreas.Sandberg@ARM.com#include "model/TransitionInfo.h" 79444SAndreas.Sandberg@ARM.com#include "model/EventInfo.h" 89444SAndreas.Sandberg@ARM.com#include "model/std_cells/StdCellLib.h" 99444SAndreas.Sandberg@ARM.com#include "model/std_cells/StdCell.h" 109444SAndreas.Sandberg@ARM.com#include "model/electrical/Multiplexer.h" 119444SAndreas.Sandberg@ARM.com#include "model/timing_graph/ElectricalNet.h" 129444SAndreas.Sandberg@ARM.com 139444SAndreas.Sandberg@ARM.comnamespace DSENT 142329SN/A{ 1510239Sbinhpham@cs.rutgers.edu using std::ceil; 162292SN/A 172292SN/A DemuxTreeDeserializer::DemuxTreeDeserializer(const String& instance_name_, const TechModel* tech_model_) 182292SN/A : ElectricalModel(instance_name_, tech_model_) 192292SN/A { 202292SN/A initParameters(); 212292SN/A initProperties(); 222292SN/A } 232292SN/A 242292SN/A DemuxTreeDeserializer::~DemuxTreeDeserializer() 252292SN/A {} 262292SN/A 272292SN/A void DemuxTreeDeserializer::initParameters() 282292SN/A { 292292SN/A addParameterName("InDataRate"); 302292SN/A addParameterName("OutDataRate"); 312292SN/A addParameterName("OutBits"); //Output width will just be output width / serialization ratio 322292SN/A addParameterName("BitDuplicate", "TRUE"); 332292SN/A return; 342292SN/A } 352292SN/A 362292SN/A void DemuxTreeDeserializer::initProperties() 372292SN/A { 382292SN/A return; 392292SN/A } 402689Sktlim@umich.edu 412689Sktlim@umich.edu DemuxTreeDeserializer* DemuxTreeDeserializer::clone() const 422689Sktlim@umich.edu { 432292SN/A // TODO 442292SN/A return NULL; 452292SN/A } 462292SN/A 472292SN/A void DemuxTreeDeserializer::constructModel() 482329SN/A { 494395Ssaidi@eecs.umich.edu 502292SN/A // Get parameters 512292SN/A double in_data_rate = getParameter("InDataRate"); 522292SN/A double out_data_rate = getParameter("OutDataRate"); 538591Sgblack@eecs.umich.edu unsigned int out_bits = getParameter("OutBits"); 5414030Sgabor.dozsa@arm.com bool bit_duplicate = getParameter("BitDuplicate"); 558506Sgblack@eecs.umich.edu 563326Sktlim@umich.edu // Calculate deserialization ratio 578481Sgblack@eecs.umich.edu unsigned int deserialization_ratio = (unsigned int) floor(in_data_rate / out_data_rate); 586658Snate@binkert.org ASSERT(deserialization_ratio == in_data_rate / out_data_rate, 592292SN/A "[Error] " + getInstanceName() + " -> Cannot have non-integer deserialization ratios!"); 608230Snate@binkert.org ASSERT((deserialization_ratio & (deserialization_ratio - 1)) == 0, 618232Snate@binkert.org "[Error] " + getInstanceName() + " -> Deserialization ratio must be a power of 2"); 623348Sbinkertn@umich.edu 632669Sktlim@umich.edu // Calculate output width 642292SN/A unsigned int input_bits = out_bits / deserialization_ratio; 658737Skoansin.tan@gmail.com ASSERT(out_bits >= deserialization_ratio, "[Error] " + getInstanceName() + 6613590Srekai.gonzalezalberquilla@arm.com " -> Output width must be >= deserialization ratio!"); 675529Snate@binkert.org ASSERT(floor((double) out_bits / deserialization_ratio) == input_bits, 682292SN/A "[Error] " + getInstanceName() + " -> Output width must be a multiple of the serialization ratio!"); 692329SN/A 702329SN/A // Store calculated numbers 712329SN/A getGenProperties()->set("DeserializationRatio", deserialization_ratio); 722329SN/A getGenProperties()->set("InputBits", input_bits); 732329SN/A 742329SN/A // Create ports 752329SN/A createInputPort("In", makeNetIndex(0, input_bits-1)); 762329SN/A createInputPort("InCK"); 772329SN/A createOutputPort("Out", makeNetIndex(0, out_bits-1)); 782329SN/A 792292SN/A //Create energy, power, and area results 802292SN/A createElectricalResults(); 8113590Srekai.gonzalezalberquilla@arm.com createElectricalEventResult("Deserialize"); 8213590Srekai.gonzalezalberquilla@arm.com getEventInfo("Deserialize")->setTransitionInfo("InCK", TransitionInfo(0.0, (double) deserialization_ratio / 2.0, 0.0)); 832292SN/A // Set conditions during idle state 8414030Sgabor.dozsa@arm.com getEventInfo("Idle")->setStaticTransitionInfos(); 8514030Sgabor.dozsa@arm.com getEventInfo("Idle")->setTransitionInfo("InCK", TransitionInfo(0.0, (double) deserialization_ratio / 2.0, 0.0)); 862733Sktlim@umich.edu 872292SN/A // Mark InCK as a false path (since timing tool will do strange stuff due to all the clock divides and stuff) 882292SN/A getNet("InCK")->setFalsePath(true); 892907Sktlim@umich.edu 902292SN/A // Create deserializer 912292SN/A if (deserialization_ratio == 1) 9213590Srekai.gonzalezalberquilla@arm.com { 9313590Srekai.gonzalezalberquilla@arm.com // No need to do anything, hohoho 9413590Srekai.gonzalezalberquilla@arm.com assign("Out", "In"); 9513590Srekai.gonzalezalberquilla@arm.com } 9613590Srekai.gonzalezalberquilla@arm.com else if (input_bits == 1) 9713590Srekai.gonzalezalberquilla@arm.com { 9813590Srekai.gonzalezalberquilla@arm.com //----------------------------------------------------------------- 9913590Srekai.gonzalezalberquilla@arm.com // Create 2:1 demux deserializer 10013590Srekai.gonzalezalberquilla@arm.com //----------------------------------------------------------------- 10113590Srekai.gonzalezalberquilla@arm.com const String& des_dff_way0_name = "DesDFFWay0"; 10213590Srekai.gonzalezalberquilla@arm.com const String& des_dff_way1_name = "DesDFFWay1"; 10314030Sgabor.dozsa@arm.com const String& des_latch_name = "DesLatch"; 10413590Srekai.gonzalezalberquilla@arm.com const String& ck_dff_name = "CKDFF"; 10513590Srekai.gonzalezalberquilla@arm.com const String& ck_inv_name = "CKINV"; 10613590Srekai.gonzalezalberquilla@arm.com const String& out_way0_name = "OutWay0"; 10713590Srekai.gonzalezalberquilla@arm.com const String& out_way1_name = "OutWay1"; 10813590Srekai.gonzalezalberquilla@arm.com const String& mid_way0_name = "MidWay0"; 10913590Srekai.gonzalezalberquilla@arm.com const String& ck_div2_name = "CK_div2"; 11013590Srekai.gonzalezalberquilla@arm.com const String& ck_div2_b_name = "CK_div2_b"; 11113590Srekai.gonzalezalberquilla@arm.com 11213590Srekai.gonzalezalberquilla@arm.com // Create nets 11313590Srekai.gonzalezalberquilla@arm.com createNet(out_way0_name); 11413590Srekai.gonzalezalberquilla@arm.com createNet(out_way1_name); 11513590Srekai.gonzalezalberquilla@arm.com createNet(mid_way0_name); 11613590Srekai.gonzalezalberquilla@arm.com createNet(ck_div2_name); 11713590Srekai.gonzalezalberquilla@arm.com createNet(ck_div2_b_name); 11813590Srekai.gonzalezalberquilla@arm.com 11913590Srekai.gonzalezalberquilla@arm.com // Create the dffs and latch needed on both ways 12013590Srekai.gonzalezalberquilla@arm.com StdCell* des_dff_way0 = getTechModel()->getStdCellLib()->createStdCell("DFFQ", des_dff_way0_name); 12113590Srekai.gonzalezalberquilla@arm.com des_dff_way0->construct(); 12213590Srekai.gonzalezalberquilla@arm.com StdCell* des_dff_way1 = getTechModel()->getStdCellLib()->createStdCell("DFFQ", des_dff_way1_name); 12313590Srekai.gonzalezalberquilla@arm.com des_dff_way1->construct(); 12413590Srekai.gonzalezalberquilla@arm.com StdCell* des_latch = getTechModel()->getStdCellLib()->createStdCell("LATQ", des_latch_name); 12513590Srekai.gonzalezalberquilla@arm.com des_latch->construct(); 12613590Srekai.gonzalezalberquilla@arm.com 12713590Srekai.gonzalezalberquilla@arm.com // Create clk divide circuit 12813590Srekai.gonzalezalberquilla@arm.com StdCell* ck_dff = getTechModel()->getStdCellLib()->createStdCell("DFFQ", ck_dff_name); 12913590Srekai.gonzalezalberquilla@arm.com ck_dff->construct(); 13013590Srekai.gonzalezalberquilla@arm.com StdCell* ck_inv = getTechModel()->getStdCellLib()->createStdCell("INV", ck_inv_name); 13113590Srekai.gonzalezalberquilla@arm.com ck_inv->construct(); 13213590Srekai.gonzalezalberquilla@arm.com 13313590Srekai.gonzalezalberquilla@arm.com // Connect ports 13413590Srekai.gonzalezalberquilla@arm.com portConnect(des_dff_way0, "CK", "InCK"); 13513590Srekai.gonzalezalberquilla@arm.com portConnect(des_dff_way0, "D", mid_way0_name); 13613590Srekai.gonzalezalberquilla@arm.com portConnect(des_dff_way0, "Q", out_way0_name); 13713590Srekai.gonzalezalberquilla@arm.com portConnect(des_latch, "G", "InCK"); 13813590Srekai.gonzalezalberquilla@arm.com portConnect(des_latch, "D", "In"); 13913590Srekai.gonzalezalberquilla@arm.com portConnect(des_latch, "Q", mid_way0_name); 14013590Srekai.gonzalezalberquilla@arm.com portConnect(des_dff_way1, "CK", "InCK"); 14113590Srekai.gonzalezalberquilla@arm.com portConnect(des_dff_way1, "D", "In"); 14213590Srekai.gonzalezalberquilla@arm.com portConnect(des_dff_way1, "Q", out_way1_name); 14313590Srekai.gonzalezalberquilla@arm.com portConnect(ck_dff, "CK", "InCK"); 14413590Srekai.gonzalezalberquilla@arm.com portConnect(ck_dff, "D", ck_div2_b_name); 14513590Srekai.gonzalezalberquilla@arm.com portConnect(ck_dff, "Q", ck_div2_name); 14613590Srekai.gonzalezalberquilla@arm.com portConnect(ck_inv, "A", ck_div2_name); 14713590Srekai.gonzalezalberquilla@arm.com portConnect(ck_inv, "Y", ck_div2_b_name); 14814030Sgabor.dozsa@arm.com 14914030Sgabor.dozsa@arm.com // Add sub instances 15013590Srekai.gonzalezalberquilla@arm.com addSubInstances(des_dff_way0, 1.0); 15113590Srekai.gonzalezalberquilla@arm.com addElectricalSubResults(des_dff_way0, 1.0); 15213590Srekai.gonzalezalberquilla@arm.com addSubInstances(des_dff_way1, 1.0); 15313590Srekai.gonzalezalberquilla@arm.com addElectricalSubResults(des_dff_way1, 1.0); 15413590Srekai.gonzalezalberquilla@arm.com addSubInstances(des_latch, 1.0); 15513590Srekai.gonzalezalberquilla@arm.com addElectricalSubResults(des_latch, 1.0); 15613590Srekai.gonzalezalberquilla@arm.com addSubInstances(ck_dff, 1.0); 15713590Srekai.gonzalezalberquilla@arm.com addElectricalSubResults(ck_dff, 1.0); 15814030Sgabor.dozsa@arm.com addSubInstances(ck_inv, 1.0); 15913590Srekai.gonzalezalberquilla@arm.com addElectricalSubResults(ck_inv, 1.0); 16013590Srekai.gonzalezalberquilla@arm.com 16113590Srekai.gonzalezalberquilla@arm.com Result* deserialize = getEventResult("Deserialize"); 16213590Srekai.gonzalezalberquilla@arm.com deserialize->addSubResult(des_dff_way0->getEventResult("CK"), des_dff_way0_name, 1.0); 16313590Srekai.gonzalezalberquilla@arm.com deserialize->addSubResult(des_dff_way0->getEventResult("DFFD"), des_dff_way0_name, 1.0); 16413590Srekai.gonzalezalberquilla@arm.com deserialize->addSubResult(des_dff_way0->getEventResult("DFFQ"), des_dff_way0_name, 1.0); 16513590Srekai.gonzalezalberquilla@arm.com deserialize->addSubResult(des_dff_way1->getEventResult("CK"), des_dff_way1_name, 1.0); 16613590Srekai.gonzalezalberquilla@arm.com deserialize->addSubResult(des_dff_way1->getEventResult("DFFD"), des_dff_way1_name, 1.0); 16713590Srekai.gonzalezalberquilla@arm.com deserialize->addSubResult(des_dff_way1->getEventResult("DFFQ"), des_dff_way1_name, 1.0); 16813590Srekai.gonzalezalberquilla@arm.com deserialize->addSubResult(des_latch->getEventResult("G"), des_latch_name, 1.0); 16913590Srekai.gonzalezalberquilla@arm.com deserialize->addSubResult(des_latch->getEventResult("LATD"), des_latch_name, 1.0); 17013590Srekai.gonzalezalberquilla@arm.com deserialize->addSubResult(des_latch->getEventResult("LATQ"), des_latch_name, 1.0); 17113590Srekai.gonzalezalberquilla@arm.com deserialize->addSubResult(ck_dff->getEventResult("CK"), ck_dff_name, 1.0); 17213590Srekai.gonzalezalberquilla@arm.com deserialize->addSubResult(ck_dff->getEventResult("DFFD"), ck_dff_name, 1.0); 17313590Srekai.gonzalezalberquilla@arm.com deserialize->addSubResult(ck_dff->getEventResult("DFFQ"), ck_dff_name, 1.0); 17413590Srekai.gonzalezalberquilla@arm.com deserialize->addSubResult(ck_inv->getEventResult("INV"), ck_inv_name, 1.0); 17513590Srekai.gonzalezalberquilla@arm.com //----------------------------------------------------------------- 17613590Srekai.gonzalezalberquilla@arm.com 17713590Srekai.gonzalezalberquilla@arm.com //----------------------------------------------------------------- 17813590Srekai.gonzalezalberquilla@arm.com // Create Sub-deserializers 17913590Srekai.gonzalezalberquilla@arm.com //----------------------------------------------------------------- 18013590Srekai.gonzalezalberquilla@arm.com // Create sub-deserializers 18113590Srekai.gonzalezalberquilla@arm.com const String& demux_way0_name = "DemuxTree_way0_" + (String) deserialization_ratio + "_to_1"; 18213590Srekai.gonzalezalberquilla@arm.com const String& demux_way1_name = "DemuxTree_way1_" + (String) deserialization_ratio + "_to_1"; 18313590Srekai.gonzalezalberquilla@arm.com 18413590Srekai.gonzalezalberquilla@arm.com DemuxTreeDeserializer* demux_way0 = new DemuxTreeDeserializer(demux_way0_name, getTechModel()); 18513590Srekai.gonzalezalberquilla@arm.com demux_way0->setParameter("InDataRate", in_data_rate / 2.0); 18613590Srekai.gonzalezalberquilla@arm.com demux_way0->setParameter("OutDataRate", out_data_rate); 18713590Srekai.gonzalezalberquilla@arm.com demux_way0->setParameter("OutBits", out_bits / 2); 18813590Srekai.gonzalezalberquilla@arm.com demux_way0->setParameter("BitDuplicate", "TRUE"); 18913590Srekai.gonzalezalberquilla@arm.com demux_way0->construct(); 19013590Srekai.gonzalezalberquilla@arm.com 19113590Srekai.gonzalezalberquilla@arm.com DemuxTreeDeserializer* demux_way1 = new DemuxTreeDeserializer(demux_way1_name, getTechModel()); 19213590Srekai.gonzalezalberquilla@arm.com demux_way1->setParameter("InDataRate", in_data_rate / 2.0); 19313590Srekai.gonzalezalberquilla@arm.com demux_way1->setParameter("OutDataRate", out_data_rate); 19413590Srekai.gonzalezalberquilla@arm.com demux_way1->setParameter("OutBits", out_bits / 2); 19513590Srekai.gonzalezalberquilla@arm.com demux_way1->setParameter("BitDuplicate", "TRUE"); 19613590Srekai.gonzalezalberquilla@arm.com demux_way1->construct(); 19713590Srekai.gonzalezalberquilla@arm.com 19813590Srekai.gonzalezalberquilla@arm.com // Connect ports 19913590Srekai.gonzalezalberquilla@arm.com portConnect(demux_way0, "In", out_way0_name); 20013590Srekai.gonzalezalberquilla@arm.com portConnect(demux_way0, "InCK", ck_div2_name); 20113590Srekai.gonzalezalberquilla@arm.com portConnect(demux_way0, "Out", "Out", makeNetIndex(0, out_bits/2-1)); 20213590Srekai.gonzalezalberquilla@arm.com 20313590Srekai.gonzalezalberquilla@arm.com portConnect(demux_way1, "In", out_way1_name); 20413590Srekai.gonzalezalberquilla@arm.com portConnect(demux_way1, "InCK", ck_div2_name); 20513590Srekai.gonzalezalberquilla@arm.com portConnect(demux_way1, "Out", "Out", makeNetIndex(out_bits/2, out_bits-1)); 20613590Srekai.gonzalezalberquilla@arm.com 20713590Srekai.gonzalezalberquilla@arm.com // Add subinstances and area results 20813590Srekai.gonzalezalberquilla@arm.com addSubInstances(demux_way0, 1.0); 20913590Srekai.gonzalezalberquilla@arm.com addElectricalSubResults(demux_way0, 1.0); 21013590Srekai.gonzalezalberquilla@arm.com addSubInstances(demux_way1, 1.0); 21113590Srekai.gonzalezalberquilla@arm.com addElectricalSubResults(demux_way1, 1.0); 21213590Srekai.gonzalezalberquilla@arm.com 21313590Srekai.gonzalezalberquilla@arm.com deserialize->addSubResult(demux_way0->getEventResult("Deserialize"), demux_way0_name, 1.0); 21413590Srekai.gonzalezalberquilla@arm.com deserialize->addSubResult(demux_way1->getEventResult("Deserialize"), demux_way1_name, 1.0); 21513590Srekai.gonzalezalberquilla@arm.com //----------------------------------------------------------------- 2162292SN/A 2172292SN/A } 21813472Srekai.gonzalezalberquilla@arm.com else if (bit_duplicate) 21913472Srekai.gonzalezalberquilla@arm.com { 22013472Srekai.gonzalezalberquilla@arm.com const String& demux_name = "DemuxTree_" + (String) deserialization_ratio + "_to_1"; 22113472Srekai.gonzalezalberquilla@arm.com 22213472Srekai.gonzalezalberquilla@arm.com DemuxTreeDeserializer* des_bit = new DemuxTreeDeserializer(demux_name, getTechModel()); 22313472Srekai.gonzalezalberquilla@arm.com des_bit->setParameter("InDataRate", in_data_rate); 22413472Srekai.gonzalezalberquilla@arm.com des_bit->setParameter("OutDataRate", out_data_rate); 2252292SN/A des_bit->setParameter("OutBits", deserialization_ratio); 2262292SN/A des_bit->setParameter("BitDuplicate", "TRUE"); 2275529Snate@binkert.org des_bit->construct(); 22813472Srekai.gonzalezalberquilla@arm.com 2292292SN/A // Create VFI and VFO nets 2302292SN/A createNet("InVFI"); 2312292SN/A createNet("OutVFO", makeNetIndex(0, deserialization_ratio-1)); 2322292SN/A 2332727Sktlim@umich.edu // Connect ports 2342727Sktlim@umich.edu portConnect(des_bit, "In", "InVFI"); 2352727Sktlim@umich.edu portConnect(des_bit, "Out", "OutVFO"); 2362907Sktlim@umich.edu 2378922Swilliam.wang@arm.com // Do VFI and VFO 2382907Sktlim@umich.edu assignVirtualFanin("InVFI", "In"); 2399444SAndreas.Sandberg@ARM.com for (unsigned int i = 0; i < input_bits; ++i) 2409444SAndreas.Sandberg@ARM.com { 2412307SN/A portConnect(des_bit, "InCK", "InCK"); 2422348SN/A for (unsigned int j = 0; j < deserialization_ratio; ++j) 2432307SN/A assignVirtualFanout("Out", makeNetIndex(i*deserialization_ratio + j), "OutVFO", makeNetIndex(j)); 2442307SN/A } 2452292SN/A // Add subinstances and area results 24613429Srekai.gonzalezalberquilla@arm.com addSubInstances(des_bit, input_bits); 2472292SN/A addElectricalSubResults(des_bit, input_bits); 24813429Srekai.gonzalezalberquilla@arm.com getEventResult("Deserialize")->addSubResult(des_bit->getEventResult("Deserialize"), demux_name, input_bits); 2492292SN/A } 25013429Srekai.gonzalezalberquilla@arm.com else 2512292SN/A { 2528545Ssaidi@eecs.umich.edu //Instantiate a bunch of 1 input bit deserializers 2538545Ssaidi@eecs.umich.edu for (unsigned int i = 0; i < input_bits; ++i) 2548545Ssaidi@eecs.umich.edu { 2558199SAli.Saidi@ARM.com const String& demux_name = "DemuxTree_" + (String) deserialization_ratio + "_to_1_bit" + (String) i; 2568199SAli.Saidi@ARM.com 2578199SAli.Saidi@ARM.com DemuxTreeDeserializer* des_bit = new DemuxTreeDeserializer(demux_name, getTechModel()); 25813590Srekai.gonzalezalberquilla@arm.com des_bit->setParameter("InDataRate", in_data_rate); 25913590Srekai.gonzalezalberquilla@arm.com des_bit->setParameter("OutDataRate", out_data_rate); 2608199SAli.Saidi@ARM.com des_bit->setParameter("OutBits", deserialization_ratio); 2618545Ssaidi@eecs.umich.edu des_bit->setParameter("BitDuplicate", "TRUE"); 2628545Ssaidi@eecs.umich.edu des_bit->construct(); 2638545Ssaidi@eecs.umich.edu 2648545Ssaidi@eecs.umich.edu portConnect(des_bit, "In", "In", makeNetIndex(i)); 2658545Ssaidi@eecs.umich.edu portConnect(des_bit, "InCK", "InCK"); 2668545Ssaidi@eecs.umich.edu portConnect(des_bit, "Out", "Out", makeNetIndex(i*deserialization_ratio, (i+1)*deserialization_ratio-1)); 2672292SN/A 26813429Srekai.gonzalezalberquilla@arm.com addSubInstances(des_bit, 1.0); 2692292SN/A addElectricalSubResults(des_bit, 1.0); 2702329SN/A getEventResult("Deserialize")->addSubResult(des_bit->getEventResult("Deserialize"), demux_name, 1.0); 2712292SN/A } 27213429Srekai.gonzalezalberquilla@arm.com } 2732292SN/A 2742292SN/A return; 2752292SN/A } 2762292SN/A 2772292SN/A void DemuxTreeDeserializer::propagateTransitionInfo() 2782292SN/A { 2792292SN/A // Get parameters 2802292SN/A bool bit_duplicate = getParameter("BitDuplicate"); 2812292SN/A // Get generated properties 2822292SN/A unsigned int deserialization_ratio = getGenProperties()->get("DeserializationRatio"); 2832292SN/A unsigned int input_bits = getGenProperties()->get("InputBits"); 2842292SN/A 2852790Sktlim@umich.edu // Calculate output transitions and activities 2862790Sktlim@umich.edu if (deserialization_ratio == 1) 2872669Sktlim@umich.edu { 2882669Sktlim@umich.edu // If no deserialization, then just propagate input transition info to output port 2892292SN/A propagatePortTransitionInfo("Out", "In"); 2902292SN/A } 2912292SN/A else if (input_bits == 1) 2922292SN/A { 2932292SN/A const String& des_dff_way0_name = "DesDFFWay0"; 2942292SN/A const String& des_dff_way1_name = "DesDFFWay1"; 2952292SN/A const String& des_latch_name = "DesLatch"; 2962292SN/A const String& ck_dff_name = "CKDFF"; 2972292SN/A const String& ck_inv_name = "CKINV"; 2982292SN/A 2992292SN/A // Sub-deserializer names 30010239Sbinhpham@cs.rutgers.edu const String& demux_way0_name = "DemuxTree_way0_" + (String) deserialization_ratio + "_to_1"; 30110239Sbinhpham@cs.rutgers.edu const String& demux_way1_name = "DemuxTree_way1_" + (String) deserialization_ratio + "_to_1"; 30210239Sbinhpham@cs.rutgers.edu 30310239Sbinhpham@cs.rutgers.edu // Update transition info for deserialization registers/latches 30410239Sbinhpham@cs.rutgers.edu ElectricalModel* des_latch = (ElectricalModel*) getSubInstance(des_latch_name); 3052292SN/A propagatePortTransitionInfo(des_latch, "G", "InCK"); 3062292SN/A propagatePortTransitionInfo(des_latch, "D", "In"); 3072292SN/A des_latch->use(); 3082292SN/A 3092292SN/A ElectricalModel* des_dff_way0 = (ElectricalModel*) getSubInstance(des_dff_way0_name); 3102292SN/A propagatePortTransitionInfo(des_dff_way0, "CK", "InCK"); 3112292SN/A propagatePortTransitionInfo(des_dff_way0, "D", des_latch, "Q"); 3122292SN/A des_dff_way0->use(); 3132292SN/A 3142292SN/A ElectricalModel* des_dff_way1 = (ElectricalModel*) getSubInstance(des_dff_way1_name); 3159444SAndreas.Sandberg@ARM.com propagatePortTransitionInfo(des_dff_way1, "CK", "InCK"); 3169444SAndreas.Sandberg@ARM.com propagatePortTransitionInfo(des_dff_way1, "D", "In"); 3179444SAndreas.Sandberg@ARM.com des_dff_way1->use(); 3182292SN/A 31913590Srekai.gonzalezalberquilla@arm.com // Get input transitions of input clock 3202292SN/A double P01_CK = getInputPort("InCK")->getTransitionInfo().getNumberTransitions01(); 3212292SN/A // Update transition info for clk division DFF 32213590Srekai.gonzalezalberquilla@arm.com ElectricalModel* ck_dff = (ElectricalModel*) getSubInstance(ck_dff_name); 3232292SN/A propagatePortTransitionInfo(ck_dff, "CK", "InCK"); 3249444SAndreas.Sandberg@ARM.com // Since it is a clock divider, P01 is D and Q are simply half the P01 of D and Q of 3259444SAndreas.Sandberg@ARM.com // the input clock 3269444SAndreas.Sandberg@ARM.com if (P01_CK != 0) ck_dff->getInputPort("D")->setTransitionInfo(TransitionInfo(0.0, P01_CK * 0.5, 0.0)); 3279444SAndreas.Sandberg@ARM.com else ck_dff->getInputPort("D")->setTransitionInfo(TransitionInfo(0.5, 0.0, 0.5)); 3289444SAndreas.Sandberg@ARM.com 3299444SAndreas.Sandberg@ARM.com ck_dff->use(); 3302292SN/A // Update transition info of clk divided inverter 3312292SN/A ElectricalModel* ck_inv = (ElectricalModel*) getSubInstance(ck_inv_name); 3322292SN/A propagatePortTransitionInfo(ck_inv, "A", ck_dff, "Q"); 3332292SN/A ck_inv->use(); 3342292SN/A 3352292SN/A // Update transition info for next demux stages 3362292SN/A ElectricalModel* demux_way0 = (ElectricalModel*) getSubInstance(demux_way0_name); 3372292SN/A propagatePortTransitionInfo(demux_way0, "In", des_dff_way0, "Q"); 3382292SN/A propagatePortTransitionInfo(demux_way0, "InCK", ck_dff, "Q"); 3392292SN/A demux_way0->use(); 34013590Srekai.gonzalezalberquilla@arm.com ElectricalModel* demux_way1 = (ElectricalModel*) getSubInstance(demux_way1_name); 34113590Srekai.gonzalezalberquilla@arm.com propagatePortTransitionInfo(demux_way1, "In", des_dff_way1, "Q"); 34213590Srekai.gonzalezalberquilla@arm.com propagatePortTransitionInfo(demux_way1, "InCK", ck_dff, "Q"); 34313590Srekai.gonzalezalberquilla@arm.com demux_way1->use(); 34413590Srekai.gonzalezalberquilla@arm.com 34513590Srekai.gonzalezalberquilla@arm.com propagatePortTransitionInfo("Out", demux_way0, "Out"); 34613590Srekai.gonzalezalberquilla@arm.com } 34713590Srekai.gonzalezalberquilla@arm.com else if (bit_duplicate) 34813590Srekai.gonzalezalberquilla@arm.com { 3492292SN/A // Propagate transition info 3502907Sktlim@umich.edu const String& demux_name = "DemuxTree_" + (String) deserialization_ratio + "_to_1"; 3512907Sktlim@umich.edu ElectricalModel* demux = (ElectricalModel*) getSubInstance(demux_name); 3522907Sktlim@umich.edu propagatePortTransitionInfo(demux, "In", "In"); 35313590Srekai.gonzalezalberquilla@arm.com propagatePortTransitionInfo(demux, "InCK", "InCK"); 3542292SN/A demux->use(); 3559444SAndreas.Sandberg@ARM.com 3569444SAndreas.Sandberg@ARM.com propagatePortTransitionInfo("Out", demux, "Out"); 3579444SAndreas.Sandberg@ARM.com } 3582698Sktlim@umich.edu else 35913429Srekai.gonzalezalberquilla@arm.com { 3602678Sktlim@umich.edu // Set output probability to be average that of probabilties of each output bit 36113590Srekai.gonzalezalberquilla@arm.com // Update all 1 bit deserializers 36213590Srekai.gonzalezalberquilla@arm.com for (unsigned int i = 0; i < input_bits; ++i) 36313590Srekai.gonzalezalberquilla@arm.com { 36413590Srekai.gonzalezalberquilla@arm.com const String& demux_name = "DemuxTree_" + (String) deserialization_ratio + "_to_1_bit" + (String) i; 36513590Srekai.gonzalezalberquilla@arm.com ElectricalModel* demux_bit = (ElectricalModel*) getSubInstance(demux_name); 3666974Stjones1@inf.ed.ac.uk propagatePortTransitionInfo(demux_bit, "In", "In"); 3672698Sktlim@umich.edu propagatePortTransitionInfo(demux_bit, "InCK", "InCK"); 36813590Srekai.gonzalezalberquilla@arm.com demux_bit->use(); 3692292SN/A 3702329SN/A propagatePortTransitionInfo("Out", demux_bit, "Out"); 37113590Srekai.gonzalezalberquilla@arm.com } 37213590Srekai.gonzalezalberquilla@arm.com } 37313590Srekai.gonzalezalberquilla@arm.com 37413590Srekai.gonzalezalberquilla@arm.com return; 37513590Srekai.gonzalezalberquilla@arm.com } 37613590Srekai.gonzalezalberquilla@arm.com 37713590Srekai.gonzalezalberquilla@arm.com} // namespace DSENT 3782329SN/A 3799440SAndreas.Sandberg@ARM.com