MUX2.cc revision 10447
14120Sgblack@eecs.umich.edu#include "model/std_cells/MUX2.h"
24120Sgblack@eecs.umich.edu
34120Sgblack@eecs.umich.edu#include <cmath>
44120Sgblack@eecs.umich.edu
54120Sgblack@eecs.umich.edu#include "model/PortInfo.h"
64120Sgblack@eecs.umich.edu#include "model/TransitionInfo.h"
74120Sgblack@eecs.umich.edu#include "model/EventInfo.h"
84120Sgblack@eecs.umich.edu#include "model/std_cells/StdCellLib.h"
94120Sgblack@eecs.umich.edu#include "model/std_cells/CellMacros.h"
104120Sgblack@eecs.umich.edu#include "model/timing_graph/ElectricalNet.h"
114120Sgblack@eecs.umich.edu#include "model/timing_graph/ElectricalDriver.h"
124120Sgblack@eecs.umich.edu#include "model/timing_graph/ElectricalLoad.h"
134120Sgblack@eecs.umich.edu#include "model/timing_graph/ElectricalDelay.h"
144120Sgblack@eecs.umich.edu
154120Sgblack@eecs.umich.edunamespace DSENT
164120Sgblack@eecs.umich.edu{
174120Sgblack@eecs.umich.edu    using std::ceil;
184120Sgblack@eecs.umich.edu    using std::max;
194120Sgblack@eecs.umich.edu
204120Sgblack@eecs.umich.edu    MUX2::MUX2(const String& instance_name_, const TechModel* tech_model_)
214120Sgblack@eecs.umich.edu        : StdCell(instance_name_, tech_model_)
224120Sgblack@eecs.umich.edu    {
234120Sgblack@eecs.umich.edu        initProperties();
244120Sgblack@eecs.umich.edu    }
254120Sgblack@eecs.umich.edu
264120Sgblack@eecs.umich.edu    MUX2::~MUX2()
274120Sgblack@eecs.umich.edu    {}
284120Sgblack@eecs.umich.edu
294120Sgblack@eecs.umich.edu    void MUX2::initProperties()
304120Sgblack@eecs.umich.edu    {
314120Sgblack@eecs.umich.edu        return;
324120Sgblack@eecs.umich.edu    }
334120Sgblack@eecs.umich.edu
344120Sgblack@eecs.umich.edu    void MUX2::constructModel()
354120Sgblack@eecs.umich.edu    {
364120Sgblack@eecs.umich.edu        // All constructModel should do is create Area/NDDPower/Energy Results as
374120Sgblack@eecs.umich.edu        // well as instantiate any sub-instances using only the hard parameters
384120Sgblack@eecs.umich.edu
394120Sgblack@eecs.umich.edu        createInputPort("A");
404120Sgblack@eecs.umich.edu        createInputPort("B");
414120Sgblack@eecs.umich.edu        createInputPort("S0");
424120Sgblack@eecs.umich.edu        createOutputPort("Y");
434120Sgblack@eecs.umich.edu
444120Sgblack@eecs.umich.edu        createLoad("A_Cap");
454120Sgblack@eecs.umich.edu        createLoad("B_Cap");
464120Sgblack@eecs.umich.edu        createLoad("S0_Cap");
474120Sgblack@eecs.umich.edu        createDelay("A_to_Y_delay");
484120Sgblack@eecs.umich.edu        createDelay("B_to_Y_delay");
494120Sgblack@eecs.umich.edu        createDelay("S0_to_Y_delay");
504120Sgblack@eecs.umich.edu        createDriver("Y_Ron", true);
514120Sgblack@eecs.umich.edu
524120Sgblack@eecs.umich.edu        ElectricalLoad* a_cap = getLoad("A_Cap");
534120Sgblack@eecs.umich.edu        ElectricalLoad* b_cap = getLoad("B_Cap");
544120Sgblack@eecs.umich.edu        ElectricalLoad* s0_cap = getLoad("S0_Cap");
554120Sgblack@eecs.umich.edu        ElectricalDelay* a_to_y_delay = getDelay("A_to_Y_delay");
564120Sgblack@eecs.umich.edu        ElectricalDelay* b_to_y_delay = getDelay("B_to_Y_delay");
574120Sgblack@eecs.umich.edu        ElectricalDelay* s0_to_y_delay = getDelay("S0_to_Y_delay");
584120Sgblack@eecs.umich.edu        ElectricalDriver* y_ron = getDriver("Y_Ron");
594120Sgblack@eecs.umich.edu
604120Sgblack@eecs.umich.edu        getNet("A")->addDownstreamNode(a_cap);
614139Sgblack@eecs.umich.edu        getNet("B")->addDownstreamNode(b_cap);
624135Sgblack@eecs.umich.edu        getNet("S0")->addDownstreamNode(s0_cap);
634120Sgblack@eecs.umich.edu        a_cap->addDownstreamNode(a_to_y_delay);
644120Sgblack@eecs.umich.edu        b_cap->addDownstreamNode(b_to_y_delay);
654120Sgblack@eecs.umich.edu        s0_cap->addDownstreamNode(s0_to_y_delay);
665114Sgblack@eecs.umich.edu        a_to_y_delay->addDownstreamNode(y_ron);
675114Sgblack@eecs.umich.edu        b_to_y_delay->addDownstreamNode(y_ron);
684135Sgblack@eecs.umich.edu        s0_to_y_delay->addDownstreamNode(y_ron);
694365Sgblack@eecs.umich.edu        y_ron->addDownstreamNode(getNet("Y"));
705114Sgblack@eecs.umich.edu
715114Sgblack@eecs.umich.edu        // Create Area result
725139Sgblack@eecs.umich.edu        createElectricalAtomicResults();
735114Sgblack@eecs.umich.edu        getEventInfo("Idle")->setStaticTransitionInfos();
745139Sgblack@eecs.umich.edu        // Create MUX2 Event Energy Result
755139Sgblack@eecs.umich.edu        createElectricalEventAtomicResult("MUX2");
765139Sgblack@eecs.umich.edu
775114Sgblack@eecs.umich.edu
785114Sgblack@eecs.umich.edu        return;
795114Sgblack@eecs.umich.edu    }
804729Sgblack@eecs.umich.edu
814365Sgblack@eecs.umich.edu    void MUX2::updateModel()
825114Sgblack@eecs.umich.edu    {
834365Sgblack@eecs.umich.edu        // Get parameters
844365Sgblack@eecs.umich.edu        double drive_strength = getDrivingStrength();
855114Sgblack@eecs.umich.edu        Map<double>* cache = getTechModel()->getStdCellLib()->getStdCellCache();
865114Sgblack@eecs.umich.edu
875114Sgblack@eecs.umich.edu        // Standard cell cache string
885114Sgblack@eecs.umich.edu        String cell_name = "MUX2_X" + (String) drive_strength;
895114Sgblack@eecs.umich.edu
905114Sgblack@eecs.umich.edu        // Get timing parameters
915114Sgblack@eecs.umich.edu        getLoad("A_Cap")->setLoadCap(cache->get(cell_name + "->Cap->A"));
925114Sgblack@eecs.umich.edu        getLoad("B_Cap")->setLoadCap(cache->get(cell_name + "->Cap->B"));
935114Sgblack@eecs.umich.edu        getLoad("S0_Cap")->setLoadCap(cache->get(cell_name + "->Cap->S0"));
945114Sgblack@eecs.umich.edu
955114Sgblack@eecs.umich.edu        getDelay("A_to_Y_delay")->setDelay(cache->get(cell_name + "->Delay->A_to_Y"));
965114Sgblack@eecs.umich.edu        getDelay("B_to_Y_delay")->setDelay(cache->get(cell_name + "->Delay->B_to_Y"));
975114Sgblack@eecs.umich.edu        getDelay("S0_to_Y_delay")->setDelay(cache->get(cell_name + "->Delay->S0_to_Y"));
985114Sgblack@eecs.umich.edu
995114Sgblack@eecs.umich.edu        getDriver("Y_Ron")->setOutputRes(cache->get(cell_name + "->DriveRes->Y"));
1005114Sgblack@eecs.umich.edu
1015139Sgblack@eecs.umich.edu        // Set the cell area
1025139Sgblack@eecs.umich.edu        getAreaResult("Active")->setValue(cache->get(cell_name + "->ActiveArea"));
1035139Sgblack@eecs.umich.edu        getAreaResult("Metal1Wire")->setValue(cache->get(cell_name + "->ActiveArea"));
1045114Sgblack@eecs.umich.edu
1055114Sgblack@eecs.umich.edu        return;
1065114Sgblack@eecs.umich.edu    }
1075114Sgblack@eecs.umich.edu
1085114Sgblack@eecs.umich.edu    void MUX2::evaluateModel()
1095114Sgblack@eecs.umich.edu    {
1105114Sgblack@eecs.umich.edu        return;
1115114Sgblack@eecs.umich.edu    }
1125139Sgblack@eecs.umich.edu
1135139Sgblack@eecs.umich.edu    void MUX2::useModel()
1145139Sgblack@eecs.umich.edu    {
1155114Sgblack@eecs.umich.edu        // Get parameters
1165114Sgblack@eecs.umich.edu        double drive_strength = getDrivingStrength();
1175114Sgblack@eecs.umich.edu        Map<double>* cache = getTechModel()->getStdCellLib()->getStdCellCache();
1185124Sgblack@eecs.umich.edu
1195114Sgblack@eecs.umich.edu        // Standard cell cache string
1205114Sgblack@eecs.umich.edu        String cell_name = "MUX2_X" + (String) drive_strength;
1215114Sgblack@eecs.umich.edu
1225114Sgblack@eecs.umich.edu        // Propagate the transition and get the 0->1 transition count
1235114Sgblack@eecs.umich.edu        propagateTransitionInfo();
1245114Sgblack@eecs.umich.edu        double P_A = getInputPort("A")->getTransitionInfo().getProbability1();
1255114Sgblack@eecs.umich.edu        double P_B = getInputPort("B")->getTransitionInfo().getProbability1();
1265139Sgblack@eecs.umich.edu        double P_S0 = getInputPort("S0")->getTransitionInfo().getProbability1();
1275139Sgblack@eecs.umich.edu        double S0_num_trans_01 = getInputPort("S0")->getTransitionInfo().getNumberTransitions01();
1285139Sgblack@eecs.umich.edu        double Y_num_trans_01 = getOutputPort("Y")->getTransitionInfo().getNumberTransitions01();
1295114Sgblack@eecs.umich.edu
1305114Sgblack@eecs.umich.edu        // Calculate leakage
1315114Sgblack@eecs.umich.edu        double leakage = 0;
1325124Sgblack@eecs.umich.edu        leakage += cache->get(cell_name + "->Leakage->!A!B!S0") * (1 - P_A) * (1 - P_B) * (1 - P_S0);
1335114Sgblack@eecs.umich.edu        leakage += cache->get(cell_name + "->Leakage->!A!BS0") * (1 - P_A) * (1 - P_B) * P_S0;
1345114Sgblack@eecs.umich.edu        leakage += cache->get(cell_name + "->Leakage->!AB!S0") * (1 - P_A) * P_B * (1 - P_S0);
1355114Sgblack@eecs.umich.edu        leakage += cache->get(cell_name + "->Leakage->!ABS0") * (1 - P_A) * P_B * P_S0;
1365114Sgblack@eecs.umich.edu        leakage += cache->get(cell_name + "->Leakage->A!B!S0") * P_A * (1 - P_B) * (1 - P_S0);
1375114Sgblack@eecs.umich.edu        leakage += cache->get(cell_name + "->Leakage->A!BS0") * P_A * (1 - P_B) * P_S0;
1385114Sgblack@eecs.umich.edu        leakage += cache->get(cell_name + "->Leakage->AB!S0") * P_A * P_B * (1 - P_S0);
1395114Sgblack@eecs.umich.edu        leakage += cache->get(cell_name + "->Leakage->ABS0") * P_A * P_B * P_S0;
1405139Sgblack@eecs.umich.edu        getNddPowerResult("Leakage")->setValue(leakage);
1415139Sgblack@eecs.umich.edu
1425139Sgblack@eecs.umich.edu        // Get VDD
1435114Sgblack@eecs.umich.edu        double vdd = getTechModel()->get("Vdd");
1445114Sgblack@eecs.umich.edu
1455114Sgblack@eecs.umich.edu        // Get capacitances
1465124Sgblack@eecs.umich.edu        double s0_b_cap = cache->get(cell_name + "->Cap->S0_b");
1475114Sgblack@eecs.umich.edu        double y_bar_cap = cache->get(cell_name + "->Cap->Y_b");
1484135Sgblack@eecs.umich.edu        double y_cap = cache->get(cell_name + "->Cap->Y");
1494150Sgblack@eecs.umich.edu        double y_load_cap = getNet("Y")->getTotalDownstreamCap();
1504365Sgblack@eecs.umich.edu        // Create mux2 event energy
1514365Sgblack@eecs.umich.edu        double mux2_event_energy = 0.0;
1524365Sgblack@eecs.umich.edu        mux2_event_energy += (s0_b_cap) * S0_num_trans_01;
1534729Sgblack@eecs.umich.edu        mux2_event_energy += (y_bar_cap + y_cap + y_load_cap) * Y_num_trans_01;
1544365Sgblack@eecs.umich.edu        mux2_event_energy *= vdd * vdd;
1554365Sgblack@eecs.umich.edu        getEventResult("MUX2")->setValue(mux2_event_energy);
1564365Sgblack@eecs.umich.edu
1574365Sgblack@eecs.umich.edu        return;
1584365Sgblack@eecs.umich.edu    }
1594365Sgblack@eecs.umich.edu
1604365Sgblack@eecs.umich.edu    void MUX2::propagateTransitionInfo()
1614365Sgblack@eecs.umich.edu    {
1624365Sgblack@eecs.umich.edu        // Get input signal transition info
1634365Sgblack@eecs.umich.edu        const TransitionInfo& trans_A = getInputPort("A")->getTransitionInfo();
1644150Sgblack@eecs.umich.edu        const TransitionInfo& trans_B = getInputPort("B")->getTransitionInfo();
1654150Sgblack@eecs.umich.edu        const TransitionInfo& trans_S0 = getInputPort("S0")->getTransitionInfo();
1664150Sgblack@eecs.umich.edu
1674150Sgblack@eecs.umich.edu        // Scale all transition information to the highest freq multiplier
1685114Sgblack@eecs.umich.edu        double max_freq_mult = max(max(trans_A.getFrequencyMultiplier(), trans_B.getFrequencyMultiplier()), trans_S0.getFrequencyMultiplier());
1695114Sgblack@eecs.umich.edu        const TransitionInfo& scaled_trans_A = trans_A.scaleFrequencyMultiplier(max_freq_mult);
1705114Sgblack@eecs.umich.edu        const TransitionInfo& scaled_trans_B = trans_B.scaleFrequencyMultiplier(max_freq_mult);
1715114Sgblack@eecs.umich.edu        const TransitionInfo& scaled_trans_S0 = trans_S0.scaleFrequencyMultiplier(max_freq_mult);
1725114Sgblack@eecs.umich.edu
1735114Sgblack@eecs.umich.edu        // Compute the probability of each transition on a given cycle
1745114Sgblack@eecs.umich.edu        double A_prob_00 = scaled_trans_A.getNumberTransitions00() / max_freq_mult;
1755114Sgblack@eecs.umich.edu        double A_prob_01 = scaled_trans_A.getNumberTransitions01() / max_freq_mult;
1765114Sgblack@eecs.umich.edu        double A_prob_10 = A_prob_01;
1775114Sgblack@eecs.umich.edu        double A_prob_11 = scaled_trans_A.getNumberTransitions11() / max_freq_mult;
1785114Sgblack@eecs.umich.edu        double B_prob_00 = scaled_trans_B.getNumberTransitions00() / max_freq_mult;
1795114Sgblack@eecs.umich.edu        double B_prob_01 = scaled_trans_B.getNumberTransitions01() / max_freq_mult;
1805114Sgblack@eecs.umich.edu        double B_prob_10 = B_prob_01;
1815114Sgblack@eecs.umich.edu        double B_prob_11 = scaled_trans_B.getNumberTransitions11() / max_freq_mult;
1825114Sgblack@eecs.umich.edu        double S0_prob_00 = scaled_trans_S0.getNumberTransitions00() / max_freq_mult;
1835114Sgblack@eecs.umich.edu        double S0_prob_01 = scaled_trans_S0.getNumberTransitions01() / max_freq_mult;
1845114Sgblack@eecs.umich.edu        double S0_prob_10 = S0_prob_01;
1855114Sgblack@eecs.umich.edu        double S0_prob_11 = scaled_trans_S0.getNumberTransitions11() / max_freq_mult;
1865114Sgblack@eecs.umich.edu
1875114Sgblack@eecs.umich.edu        // Compute output probabilities
1885114Sgblack@eecs.umich.edu        double Y_prob_00 = S0_prob_00 * A_prob_00 +
1895114Sgblack@eecs.umich.edu                            S0_prob_01 * (A_prob_00 + A_prob_01) * (B_prob_00 + B_prob_10) +
1905114Sgblack@eecs.umich.edu                            S0_prob_10 * (A_prob_00 + A_prob_10) * (B_prob_00 + B_prob_01) +
1915114Sgblack@eecs.umich.edu                            S0_prob_11 * B_prob_00;
1925114Sgblack@eecs.umich.edu        double Y_prob_01 = S0_prob_00 * A_prob_01 +
1935114Sgblack@eecs.umich.edu                            S0_prob_01 * (A_prob_00 + A_prob_01) * (B_prob_01 + B_prob_11) +
1945114Sgblack@eecs.umich.edu                            S0_prob_10 * (A_prob_01 + A_prob_11) * (B_prob_00 + B_prob_01) +
1955114Sgblack@eecs.umich.edu                            S0_prob_11 * B_prob_01;
1965114Sgblack@eecs.umich.edu        double Y_prob_11 = S0_prob_00 * A_prob_11 +
1975114Sgblack@eecs.umich.edu                            S0_prob_01 * (A_prob_10 + A_prob_11) * (B_prob_01 + B_prob_11) +
1985114Sgblack@eecs.umich.edu                            S0_prob_10 * (A_prob_01 + A_prob_11) * (B_prob_10 + B_prob_11) +
1995114Sgblack@eecs.umich.edu                            S0_prob_11 * B_prob_11;
2005114Sgblack@eecs.umich.edu
2015114Sgblack@eecs.umich.edu        // Check that probabilities add up to 1.0 with some finite tolerance
2025114Sgblack@eecs.umich.edu        ASSERT(LibUtil::Math::isEqual((Y_prob_00 + Y_prob_01 + Y_prob_01 + Y_prob_11), 1.0),
2035114Sgblack@eecs.umich.edu            "[Error] " + getInstanceName() +  "Output transition probabilities must add up to 1 (" +
2045114Sgblack@eecs.umich.edu            (String) Y_prob_00 + ", " + (String) Y_prob_01 + ", " + (String) Y_prob_11 + ")!");
2055114Sgblack@eecs.umich.edu
2065114Sgblack@eecs.umich.edu        // Turn probability of transitions per cycle into number of transitions per time unit
2075114Sgblack@eecs.umich.edu        TransitionInfo trans_Y(Y_prob_00 * max_freq_mult, Y_prob_01 * max_freq_mult, Y_prob_11 * max_freq_mult);
2085114Sgblack@eecs.umich.edu        getOutputPort("Y")->setTransitionInfo(trans_Y);
2095114Sgblack@eecs.umich.edu
2105114Sgblack@eecs.umich.edu        return;
2115114Sgblack@eecs.umich.edu    }
2125114Sgblack@eecs.umich.edu
2135114Sgblack@eecs.umich.edu    // Creates the standard cell, characterizes and abstracts away the details
2145114Sgblack@eecs.umich.edu    void MUX2::cacheStdCell(StdCellLib* cell_lib_, double drive_strength_)
2155114Sgblack@eecs.umich.edu    {
2165114Sgblack@eecs.umich.edu        // Get parameters
2175114Sgblack@eecs.umich.edu        double gate_pitch = cell_lib_->getTechModel()->get("Gate->PitchContacted");
2185114Sgblack@eecs.umich.edu        Map<double>* cache = cell_lib_->getStdCellCache();
2195114Sgblack@eecs.umich.edu
2205114Sgblack@eecs.umich.edu        // Standard cell cache string
2215114Sgblack@eecs.umich.edu        String cell_name = "MUX2_X" + (String) drive_strength_;
2225114Sgblack@eecs.umich.edu
2235114Sgblack@eecs.umich.edu        Log::printLine("=== " + cell_name + " ===");
2245114Sgblack@eecs.umich.edu
2255114Sgblack@eecs.umich.edu        // Now actually build the full standard cell model
2265114Sgblack@eecs.umich.edu        createInputPort("A");
2275114Sgblack@eecs.umich.edu        createInputPort("B");
2285114Sgblack@eecs.umich.edu        createInputPort("S0");
2295114Sgblack@eecs.umich.edu        createOutputPort("Y");
2305114Sgblack@eecs.umich.edu
2315114Sgblack@eecs.umich.edu        createNet("S0_b");
2325114Sgblack@eecs.umich.edu        createNet("Y_b");
2335114Sgblack@eecs.umich.edu
2345114Sgblack@eecs.umich.edu        // Adds macros
2355114Sgblack@eecs.umich.edu        CellMacros::addInverter(this, "INV1", false, true, "S0", "S0_b");
2365114Sgblack@eecs.umich.edu        CellMacros::addInverter(this, "INV2", false, true, "Y_b", "Y");
2375114Sgblack@eecs.umich.edu        CellMacros::addTristate(this, "INVZ1", true, true, true, true, "A", "S0_b", "S0", "Y_b");
2385114Sgblack@eecs.umich.edu        CellMacros::addTristate(this, "INVZ2", true, true, true, true, "B", "S0", "S0_b", "Y_b");
2395114Sgblack@eecs.umich.edu
2405114Sgblack@eecs.umich.edu        // I have no idea how to size each of the parts haha
2415114Sgblack@eecs.umich.edu        CellMacros::updateInverter(this, "INV1", drive_strength_ * 0.250);
2425114Sgblack@eecs.umich.edu        CellMacros::updateInverter(this, "INV2", drive_strength_ * 1.000);
2435114Sgblack@eecs.umich.edu        CellMacros::updateTristate(this, "INVZ1", drive_strength_ * 0.500);
2445114Sgblack@eecs.umich.edu        CellMacros::updateTristate(this, "INVZ2", drive_strength_ * 0.500);
2455114Sgblack@eecs.umich.edu
2465114Sgblack@eecs.umich.edu        // Cache area result
2475114Sgblack@eecs.umich.edu        double area = 0.0;
2485114Sgblack@eecs.umich.edu        area += gate_pitch * getTotalHeight() * 1;
2495114Sgblack@eecs.umich.edu        area += gate_pitch * getTotalHeight() * getGenProperties()->get("INV1_GatePitches").toDouble();
2505114Sgblack@eecs.umich.edu        area += gate_pitch * getTotalHeight() * getGenProperties()->get("INV2_GatePitches").toDouble();
2515114Sgblack@eecs.umich.edu        area += gate_pitch * getTotalHeight() * getGenProperties()->get("INVZ1_GatePitches").toDouble();
2525114Sgblack@eecs.umich.edu        area += gate_pitch * getTotalHeight() * getGenProperties()->get("INVZ2_GatePitches").toDouble();
2535114Sgblack@eecs.umich.edu        cache->set(cell_name + "->ActiveArea", area);
2545114Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->ActiveArea=" + (String) area);
2555114Sgblack@eecs.umich.edu
2565114Sgblack@eecs.umich.edu        // --------------------------------------------------------------------
2575114Sgblack@eecs.umich.edu        // Cache Leakage Power (for every single signal combination)
2585114Sgblack@eecs.umich.edu        // --------------------------------------------------------------------
2595114Sgblack@eecs.umich.edu        double leakage_000 = 0;          //!A, !B, !S0
2605114Sgblack@eecs.umich.edu        double leakage_001 = 0;          //!A, !B, S0
2615114Sgblack@eecs.umich.edu        double leakage_010 = 0;          //!A, B, !S0
2625114Sgblack@eecs.umich.edu        double leakage_011 = 0;          //!A, B, S0
2635114Sgblack@eecs.umich.edu        double leakage_100 = 0;          //A, !B, !S0
2645114Sgblack@eecs.umich.edu        double leakage_101 = 0;          //A, !B, S0
2655114Sgblack@eecs.umich.edu        double leakage_110 = 0;          //A, B, !S0
2665114Sgblack@eecs.umich.edu        double leakage_111 = 0;          //A, B, S0
2675114Sgblack@eecs.umich.edu
2685114Sgblack@eecs.umich.edu        //This is so painful...
2695114Sgblack@eecs.umich.edu        leakage_000 += getGenProperties()->get("INV1_LeakagePower_0").toDouble();
2705114Sgblack@eecs.umich.edu        leakage_000 += getGenProperties()->get("INV2_LeakagePower_1").toDouble();
2715114Sgblack@eecs.umich.edu        leakage_000 += getGenProperties()->get("INVZ1_LeakagePower_100_1").toDouble();
2725114Sgblack@eecs.umich.edu        leakage_000 += getGenProperties()->get("INVZ2_LeakagePower_010_1").toDouble();
2735114Sgblack@eecs.umich.edu
2745114Sgblack@eecs.umich.edu        leakage_001 += getGenProperties()->get("INV1_LeakagePower_1").toDouble();
2755114Sgblack@eecs.umich.edu        leakage_001 += getGenProperties()->get("INV2_LeakagePower_1").toDouble();
2765114Sgblack@eecs.umich.edu        leakage_001 += getGenProperties()->get("INVZ1_LeakagePower_010_1").toDouble();
2775114Sgblack@eecs.umich.edu        leakage_001 += getGenProperties()->get("INVZ2_LeakagePower_100_1").toDouble();
2785114Sgblack@eecs.umich.edu
2795114Sgblack@eecs.umich.edu        leakage_010 += getGenProperties()->get("INV1_LeakagePower_0").toDouble();
2805114Sgblack@eecs.umich.edu        leakage_010 += getGenProperties()->get("INV2_LeakagePower_1").toDouble();
2815114Sgblack@eecs.umich.edu        leakage_010 += getGenProperties()->get("INVZ1_LeakagePower_100_1").toDouble();
2825114Sgblack@eecs.umich.edu        leakage_010 += getGenProperties()->get("INVZ2_LeakagePower_011_1").toDouble();
2835114Sgblack@eecs.umich.edu
2845114Sgblack@eecs.umich.edu        leakage_011 += getGenProperties()->get("INV1_LeakagePower_1").toDouble();
2855114Sgblack@eecs.umich.edu        leakage_011 += getGenProperties()->get("INV2_LeakagePower_0").toDouble();
2865114Sgblack@eecs.umich.edu        leakage_011 += getGenProperties()->get("INVZ1_LeakagePower_010_0").toDouble();
2875114Sgblack@eecs.umich.edu        leakage_011 += getGenProperties()->get("INVZ2_LeakagePower_101_0").toDouble();
2885114Sgblack@eecs.umich.edu
2895114Sgblack@eecs.umich.edu        leakage_100 += getGenProperties()->get("INV1_LeakagePower_0").toDouble();
2905114Sgblack@eecs.umich.edu        leakage_100 += getGenProperties()->get("INV2_LeakagePower_0").toDouble();
2915114Sgblack@eecs.umich.edu        leakage_100 += getGenProperties()->get("INVZ1_LeakagePower_101_0").toDouble();
2925114Sgblack@eecs.umich.edu        leakage_100 += getGenProperties()->get("INVZ2_LeakagePower_010_0").toDouble();
2935114Sgblack@eecs.umich.edu
2945114Sgblack@eecs.umich.edu        leakage_101 += getGenProperties()->get("INV1_LeakagePower_1").toDouble();
2955114Sgblack@eecs.umich.edu        leakage_101 += getGenProperties()->get("INV2_LeakagePower_0").toDouble();
2965114Sgblack@eecs.umich.edu        leakage_101 += getGenProperties()->get("INVZ1_LeakagePower_011_1").toDouble();
2975114Sgblack@eecs.umich.edu        leakage_101 += getGenProperties()->get("INVZ2_LeakagePower_100_1").toDouble();
2985114Sgblack@eecs.umich.edu
2995139Sgblack@eecs.umich.edu        leakage_110 += getGenProperties()->get("INV1_LeakagePower_1").toDouble();
3005139Sgblack@eecs.umich.edu        leakage_110 += getGenProperties()->get("INV2_LeakagePower_1").toDouble();
3015114Sgblack@eecs.umich.edu        leakage_110 += getGenProperties()->get("INVZ1_LeakagePower_101_0").toDouble();
3025114Sgblack@eecs.umich.edu        leakage_110 += getGenProperties()->get("INVZ2_LeakagePower_011_0").toDouble();
3035114Sgblack@eecs.umich.edu
3045114Sgblack@eecs.umich.edu        leakage_111 += getGenProperties()->get("INV1_LeakagePower_1").toDouble();
3055114Sgblack@eecs.umich.edu        leakage_111 += getGenProperties()->get("INV2_LeakagePower_1").toDouble();
3065114Sgblack@eecs.umich.edu        leakage_111 += getGenProperties()->get("INVZ1_LeakagePower_011_0").toDouble();
3075114Sgblack@eecs.umich.edu        leakage_111 += getGenProperties()->get("INVZ2_LeakagePower_101_0").toDouble();
3085114Sgblack@eecs.umich.edu
3095114Sgblack@eecs.umich.edu        cache->set(cell_name + "->Leakage->!A!B!S0", leakage_000);
3105114Sgblack@eecs.umich.edu        cache->set(cell_name + "->Leakage->!A!BS0", leakage_001);
3115114Sgblack@eecs.umich.edu        cache->set(cell_name + "->Leakage->!AB!S0", leakage_010);
3125114Sgblack@eecs.umich.edu        cache->set(cell_name + "->Leakage->!ABS0", leakage_011);
3135114Sgblack@eecs.umich.edu        cache->set(cell_name + "->Leakage->A!B!S0", leakage_100);
3145114Sgblack@eecs.umich.edu        cache->set(cell_name + "->Leakage->A!BS0", leakage_101);
3155114Sgblack@eecs.umich.edu        cache->set(cell_name + "->Leakage->AB!S0", leakage_110);
3165114Sgblack@eecs.umich.edu        cache->set(cell_name + "->Leakage->ABS0", leakage_111);
3175114Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Leakage->!A!B!S0=" + (String) leakage_000);
3185114Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Leakage->!A!BS0=" + (String) leakage_001);
3195114Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Leakage->!AB!S0=" + (String) leakage_010);
3205652Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Leakage->!ABS0=" + (String) leakage_011);
3215114Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Leakage->A!B!S0=" + (String) leakage_100);
3225114Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Leakage->A!BS0=" + (String) leakage_101);
3235114Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Leakage->AB!S0=" + (String) leakage_110);
3245114Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Leakage->ABS0=" + (String) leakage_111);
3255114Sgblack@eecs.umich.edu
3265114Sgblack@eecs.umich.edu        // Cache event energy results
3275114Sgblack@eecs.umich.edu        /*
3285652Sgblack@eecs.umich.edu        double event_a_flip = 0.0;
3295114Sgblack@eecs.umich.edu        event_a_flip += getGenProperties()->get("INVZ1_A_Flip").toDouble();
3305114Sgblack@eecs.umich.edu        cache->set(cell_name + "->Event_A_Flip", event_a_flip);
3315114Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Event_A_Flip=" + (String) event_a_flip);
3325114Sgblack@eecs.umich.edu
3335114Sgblack@eecs.umich.edu        double event_b_flip = 0.0;
3345114Sgblack@eecs.umich.edu        event_b_flip += getGenProperties()->get("INVZ1_A_Flip").toDouble();
3355114Sgblack@eecs.umich.edu        cache->set(cell_name + "->Event_B_Flip", event_b_flip);
3365652Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Event_B_Flip=" + (String) event_b_flip);
3375114Sgblack@eecs.umich.edu
3385114Sgblack@eecs.umich.edu        double event_s0_flip = 0.0;
3395114Sgblack@eecs.umich.edu        event_s0_flip += getGenProperties()->get("INV1_A_Flip").toDouble();
3405114Sgblack@eecs.umich.edu        event_s0_flip += getGenProperties()->get("INV1_ZN_Flip").toDouble();
3415114Sgblack@eecs.umich.edu        event_s0_flip += getGenProperties()->get("INVZ1_OE_Flip").toDouble() + getGenProperties()->get("INVZ1_OEN_Flip").toDouble();
3425114Sgblack@eecs.umich.edu        event_s0_flip += getGenProperties()->get("INVZ2_OE_Flip").toDouble() + getGenProperties()->get("INVZ2_OEN_Flip").toDouble();
3435114Sgblack@eecs.umich.edu        cache->set(cell_name + "->Event_S0_Flip", event_s0_flip);
3445652Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Event_S0_Flip=" + (String) event_s0_flip);
3455114Sgblack@eecs.umich.edu
3465114Sgblack@eecs.umich.edu        double event_y_flip = 0.0;
3475114Sgblack@eecs.umich.edu        event_y_flip += getGenProperties()->get("INVZ1_ZN_Flip").toDouble();
3485114Sgblack@eecs.umich.edu        event_y_flip += getGenProperties()->get("INVZ2_ZN_Flip").toDouble();
3495114Sgblack@eecs.umich.edu        event_y_flip += getGenProperties()->get("INV2_A_Flip").toDouble();
3505114Sgblack@eecs.umich.edu        event_y_flip += getGenProperties()->get("INV2_ZN_Flip").toDouble();
3515114Sgblack@eecs.umich.edu        cache->set(cell_name + "->Event_Y_Flip", event_y_flip);
3525652Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Event_Y_Flip=" + (String) event_y_flip);
3535114Sgblack@eecs.umich.edu
3545114Sgblack@eecs.umich.edu        double a_cap = getLoad("INVZ1_CgA")->getLoadCap();
3555114Sgblack@eecs.umich.edu        double b_cap = getLoad("INVZ2_CgA")->getLoadCap();
3565114Sgblack@eecs.umich.edu        double s0_cap = getLoad("INV1_CgA")->getLoadCap() + getLoad("INVZ1_CgOEN")->getLoadCap() + getLoad("INVZ2_CgOE")->getLoadCap();
3575114Sgblack@eecs.umich.edu        double y_ron = getDriver("INV2_RonZN")->getOutputRes();
3585114Sgblack@eecs.umich.edu        */
3595114Sgblack@eecs.umich.edu        // --------------------------------------------------------------------
3605652Sgblack@eecs.umich.edu
3615114Sgblack@eecs.umich.edu        // --------------------------------------------------------------------
3625114Sgblack@eecs.umich.edu        // Get Node capacitances
3635114Sgblack@eecs.umich.edu        // --------------------------------------------------------------------
3645114Sgblack@eecs.umich.edu        double a_cap = getNet("A")->getTotalDownstreamCap();
3655114Sgblack@eecs.umich.edu        double b_cap = getNet("B")->getTotalDownstreamCap();
3665114Sgblack@eecs.umich.edu        double s0_cap = getNet("S0")->getTotalDownstreamCap();
3675114Sgblack@eecs.umich.edu        double s0_b_cap = getNet("S0_b")->getTotalDownstreamCap();
3685114Sgblack@eecs.umich.edu        double y_b_cap = getNet("Y_b")->getTotalDownstreamCap();
3695114Sgblack@eecs.umich.edu        double y_cap = getNet("Y")->getTotalDownstreamCap();
3705114Sgblack@eecs.umich.edu
3715114Sgblack@eecs.umich.edu        cache->set(cell_name + "->Cap->A", a_cap);
3725124Sgblack@eecs.umich.edu        cache->set(cell_name + "->Cap->B", b_cap);
3735124Sgblack@eecs.umich.edu        cache->set(cell_name + "->Cap->S0", s0_cap);
3745124Sgblack@eecs.umich.edu        cache->set(cell_name + "->Cap->S0_b", s0_b_cap);
3755124Sgblack@eecs.umich.edu        cache->set(cell_name + "->Cap->Y_b", y_b_cap);
3765124Sgblack@eecs.umich.edu        cache->set(cell_name + "->Cap->Y", y_cap);
3775124Sgblack@eecs.umich.edu
3785114Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Cap->A=" + (String) a_cap);
3795124Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Cap->B=" + (String) b_cap);
3805124Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Cap->S0=" + (String) s0_cap);
3815114Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Cap->S0_b=" + (String) s0_b_cap);
3825114Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Cap->Y_b=" + (String) y_b_cap);
3835114Sgblack@eecs.umich.edu        Log::printLine(cell_name + "->Cap->Y=" + (String) y_cap);
3845114Sgblack@eecs.umich.edu        // --------------------------------------------------------------------
3855124Sgblack@eecs.umich.edu
3865124Sgblack@eecs.umich.edu        // --------------------------------------------------------------------
3875124Sgblack@eecs.umich.edu        // Build Internal Delay Model
3885124Sgblack@eecs.umich.edu        // --------------------------------------------------------------------
3895124Sgblack@eecs.umich.edu        // Build abstracted timing model
3905124Sgblack@eecs.umich.edu        double y_ron = getDriver("INV2_RonZN")->getOutputRes();
3915114Sgblack@eecs.umich.edu
3925124Sgblack@eecs.umich.edu        double a_to_y_delay = 0.0;
3935124Sgblack@eecs.umich.edu        a_to_y_delay += getDriver("INVZ1_RonZN")->calculateDelay();
3945114Sgblack@eecs.umich.edu        a_to_y_delay += getDriver("INV2_RonZN")->calculateDelay();
3954120Sgblack@eecs.umich.edu
3964120Sgblack@eecs.umich.edu        double b_to_y_delay = 0.0;
3974120Sgblack@eecs.umich.edu        b_to_y_delay += getDriver("INVZ1_RonZN")->calculateDelay();
398        b_to_y_delay += getDriver("INV2_RonZN")->calculateDelay();
399
400        double s0_to_y_delay = 0.0;
401        s0_to_y_delay += getDriver("INV1_RonZN")->calculateDelay();
402        s0_to_y_delay += max(getDriver("INVZ1_RonZN")->calculateDelay(), getDriver("INVZ1_RonZN")->calculateDelay());
403        s0_to_y_delay += getDriver("INV2_RonZN")->calculateDelay();
404
405        cache->set(cell_name + "->DriveRes->Y", y_ron);
406        cache->set(cell_name + "->Delay->A_to_Y", a_to_y_delay);
407        cache->set(cell_name + "->Delay->B_to_Y", b_to_y_delay);
408        cache->set(cell_name + "->Delay->S0_to_Y", s0_to_y_delay);
409
410        Log::printLine(cell_name + "->DriveRes->Y=" + (String) y_ron);
411        Log::printLine(cell_name + "->Delay->A_to_Y=" + (String) a_to_y_delay);
412        Log::printLine(cell_name + "->Delay->B_to_Y=" + (String) b_to_y_delay);
413        Log::printLine(cell_name + "->Delay->S0_to_Y=" + (String) s0_to_y_delay);
414        // --------------------------------------------------------------------
415
416        return;
417    }
418
419} // namespace DSENT
420
421