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