MatrixArbiter.cc revision 10447:a465576671d4
12623SN/A#include "model/electrical/MatrixArbiter.h"
22623SN/A
32623SN/A#include <cmath>
42623SN/A#include <vector>
52623SN/A
62623SN/A#include "model/PortInfo.h"
72623SN/A#include "model/EventInfo.h"
82623SN/A#include "model/TransitionInfo.h"
92623SN/A#include "model/ModelGen.h"
102623SN/A#include "model/std_cells/StdCell.h"
112623SN/A#include "model/std_cells/StdCellLib.h"
122623SN/A
132623SN/Anamespace DSENT
142623SN/A{
152623SN/A    using std::abs;
162623SN/A    using std::vector;
172623SN/A
182623SN/A    MatrixArbiter::MatrixArbiter(const String& instance_name_, const TechModel* tech_model_)
192623SN/A        : ElectricalModel(instance_name_, tech_model_)
202623SN/A    {
212623SN/A        initParameters();
222623SN/A        initProperties();
232623SN/A    }
242623SN/A
252623SN/A    MatrixArbiter::~MatrixArbiter()
262623SN/A    {}
272665Ssaidi@eecs.umich.edu
282665Ssaidi@eecs.umich.edu    void MatrixArbiter::initParameters()
292623SN/A    {
302623SN/A        addParameterName("NumberRequests");
313170Sstever@eecs.umich.edu        return;
325103Ssaidi@eecs.umich.edu    }
332623SN/A
344040Ssaidi@eecs.umich.edu    void MatrixArbiter::initProperties()
356658Snate@binkert.org    {
362623SN/A        return;
372623SN/A    }
383348Sbinkertn@umich.edu
393348Sbinkertn@umich.edu    MatrixArbiter* MatrixArbiter::clone() const
404762Snate@binkert.org    {
412901Ssaidi@eecs.umich.edu        // TODO
422623SN/A        return NULL;
432623SN/A    }
442623SN/A
452623SN/A    void MatrixArbiter::constructModel()
462856Srdreslin@umich.edu    {
472856Srdreslin@umich.edu        // Get parameters
482856Srdreslin@umich.edu        unsigned int number_requests = getParameter("NumberRequests").toUInt();
492856Srdreslin@umich.edu
502856Srdreslin@umich.edu        ASSERT(number_requests > 0, "[Error] " + getInstanceName() +
512856Srdreslin@umich.edu                " -> Number of requests must be > 0!");
522856Srdreslin@umich.edu
532856Srdreslin@umich.edu        // Connect ports
542856Srdreslin@umich.edu        createInputPort("CK");
552856Srdreslin@umich.edu        for(unsigned int i = 0; i < number_requests; ++i)
562623SN/A        {
572623SN/A            createInputPort("Request" + (String)i);
582623SN/A            createOutputPort("Grant" + (String)i);
592623SN/A        }
602623SN/A
612623SN/A        // Create area, power, event results
622680Sktlim@umich.edu        createElectricalResults();
632680Sktlim@umich.edu        getEventInfo("Idle")->setStaticTransitionInfos();
642623SN/A        getEventInfo("Idle")->setTransitionInfo("CK", TransitionInfo(0.0, 1.0, 0.0));
652623SN/A//        for(unsigned int i = 0; i <= number_requests; ++i)
665712Shsul@eecs.umich.edu//        {
672623SN/A//            // Create arbitrate event with i requests
682623SN/A//            createElectricalEventResult("Arbitrate" + (String)i);
692623SN/A//            EventInfo* event_info = getEventInfo("Arbitrate" + (String)i);
702623SN/A//            event_info->setTransitionInfo("CK", TransitionInfo(0.0, 1.0, 0.0));
712623SN/A//
723349Sbinkertn@umich.edu//            for(unsigned int j = 0; j < i; ++j)
732623SN/A//            {
742623SN/A//                event_info->setTransitionInfo("Request" + (String)j, TransitionInfo(0.0, 0.0, 1.0));
752623SN/A//            }
762623SN/A//            for(unsigned int j = i; j < number_requests; ++j)
772623SN/A//            {
782623SN/A//                event_info->setTransitionInfo("Request" + (String)j, TransitionInfo(1.0, 0.0, 0.0));
793349Sbinkertn@umich.edu//
802623SN/A//            }
813184Srdreslin@umich.edu//            //double P_0 = (double)(number_requests - i) / (double)(number_requests);
823184Srdreslin@umich.edu//            //double P_1 = (double)(i) / (double)(number_requests);
832623SN/A//            //TransitionInfo trans(P_0 * P_0, P_0 * P_1, P_1 * P_1);
842623SN/A//
852623SN/A//            //for(unsigned int j = 0; j < number_requests; ++j)
862623SN/A//            //{
872623SN/A//            //    event_info->setTransitionInfo("Request" + (String)j, trans);
883647Srdreslin@umich.edu//            //}
893647Srdreslin@umich.edu//        }
903647Srdreslin@umich.edu        createElectricalEventResult("Arbitrate");
913647Srdreslin@umich.edu        getEventInfo("Arbitrate")->setTransitionInfo("CK", TransitionInfo(0.0, 1.0, 0.0));
923647Srdreslin@umich.edu        for(unsigned int i = 0; i < number_requests; ++i)
932631SN/A        {
943647Srdreslin@umich.edu            getEventInfo("Arbitrate")->setTransitionInfo("Request" + (String)i, TransitionInfo(0.25, 0.25, 0.25));
952631SN/A        }
962623SN/A
972623SN/A        if(number_requests == 1)
982623SN/A        {
992948Ssaidi@eecs.umich.edu            assign("Grant0", "Request0");
1002948Ssaidi@eecs.umich.edu        }
1013349Sbinkertn@umich.edu        else
1022948Ssaidi@eecs.umich.edu        {
1032948Ssaidi@eecs.umich.edu            // Init components
1045606Snate@binkert.org            vector<String> g_inv_names(number_requests, "");
1052948Ssaidi@eecs.umich.edu            vector<StdCell*> g_invs(number_requests, NULL);
1062948Ssaidi@eecs.umich.edu            vector<String> g_and2_names(number_requests, "");
1075529Snate@binkert.org            vector<StdCell*> g_and2s(number_requests, NULL);
1085894Sgblack@eecs.umich.edu            for(unsigned int i = 0; i < number_requests; ++i)
1095894Sgblack@eecs.umich.edu            {
1102623SN/A                g_inv_names[i] = "G_INV" + (String)i;
1112623SN/A                g_and2_names[i] = "G_AND2" + (String)i;
1123647Srdreslin@umich.edu                g_invs[i] = getTechModel()->getStdCellLib()->createStdCell("INV", g_inv_names[i]);
1133647Srdreslin@umich.edu                g_invs[i]->construct();
1143647Srdreslin@umich.edu                g_and2s[i] = getTechModel()->getStdCellLib()->createStdCell("AND2", g_and2_names[i]);
1153647Srdreslin@umich.edu                g_and2s[i]->construct();
1162623SN/A            }
1172839Sktlim@umich.edu
1183222Sktlim@umich.edu            unsigned int number_states = (number_requests - 1) * number_requests / 2;
1192901Ssaidi@eecs.umich.edu
1202623SN/A            vector<String> w_or2_names(number_states, "");
1212623SN/A            vector<StdCell*> w_or2s(number_states, NULL);
1222623SN/A            vector<String> w_and2_names(number_states, "");
1232623SN/A            vector<StdCell*> w_and2s(number_states, NULL);
1242623SN/A            vector<String> w_inv_names(number_states, "");
1252623SN/A            vector<StdCell*> w_invs(number_states, NULL);
1262623SN/A            vector<String> w_dff_names(number_states, "");
1272623SN/A            vector<StdCell*> w_dffs(number_states, NULL);
1282623SN/A            vector<String> dis_and2_names(number_states * 2, "");
1292623SN/A            vector<StdCell*> dis_and2s(number_states * 2, NULL);
1302915Sktlim@umich.edu            vector<String> dis_inv_names(number_states, "");
1312915Sktlim@umich.edu            vector<StdCell*> dis_invs(number_states, NULL);
1322623SN/A            unsigned int state_count = 0;
1332623SN/A            for(unsigned int i = 0; i < number_requests; ++i)
1342623SN/A            {
1352623SN/A                for(unsigned int j = i + 1; j < number_requests; ++j)
1362623SN/A                {
1372623SN/A                    w_or2_names[state_count] = String::format("W_OR2_%d_%d", i, j);
1382915Sktlim@umich.edu                    w_and2_names[state_count] = String::format("W_AND2_%d_%d", i, j);
1392915Sktlim@umich.edu                    w_inv_names[state_count] = String::format("W_INV_%d_%d", i, j);
1402623SN/A                    w_dff_names[state_count] = String::format("W_DFF_%d_%d", i, j);
1412798Sktlim@umich.edu                    w_or2s[state_count] = getTechModel()->getStdCellLib()->createStdCell("OR2", w_or2_names[state_count]);
1422798Sktlim@umich.edu                    w_or2s[state_count]->construct();
1432901Ssaidi@eecs.umich.edu                    w_and2s[state_count] = getTechModel()->getStdCellLib()->createStdCell("AND2", w_and2_names[state_count]);
1442839Sktlim@umich.edu                    w_and2s[state_count]->construct();
1452798Sktlim@umich.edu                    w_invs[state_count] = getTechModel()->getStdCellLib()->createStdCell("INV", w_inv_names[state_count]);
1462839Sktlim@umich.edu                    w_invs[state_count]->construct();
1472798Sktlim@umich.edu                    w_dffs[state_count] = getTechModel()->getStdCellLib()->createStdCell("DFFQ", w_dff_names[state_count]);
1485496Ssaidi@eecs.umich.edu                    w_dffs[state_count]->construct();
1492901Ssaidi@eecs.umich.edu
1502901Ssaidi@eecs.umich.edu                    dis_inv_names[state_count] = String::format("Dis_INV_%d_%d", i, j);
1512798Sktlim@umich.edu                    dis_and2_names[state_count] = String::format("Dis_AND2_%d_%d", i, j);
1522839Sktlim@umich.edu                    dis_and2_names[state_count + number_states] = String::format("Dis_AND2_%d_%d", j, i);
1532839Sktlim@umich.edu                    dis_invs[state_count] = getTechModel()->getStdCellLib()->createStdCell("INV", dis_inv_names[state_count]);
1542901Ssaidi@eecs.umich.edu                    dis_invs[state_count]->construct();
1552798Sktlim@umich.edu                    dis_and2s[state_count] = getTechModel()->getStdCellLib()->createStdCell("AND2", dis_and2_names[state_count]);
1562623SN/A                    dis_and2s[state_count]->construct();
1572623SN/A                    dis_and2s[state_count + number_states] = getTechModel()->getStdCellLib()->createStdCell("AND2", dis_and2_names[state_count + number_states]);
1582623SN/A                    dis_and2s[state_count + number_states]->construct();
1592798Sktlim@umich.edu                    state_count++;
1602623SN/A                }
1615221Ssaidi@eecs.umich.edu            }
1622798Sktlim@umich.edu
1634762Snate@binkert.org            vector<String> dis_or_names(number_requests, "");
1643201Shsul@eecs.umich.edu            vector<ElectricalModel*> dis_ors(number_requests, NULL);
1655710Scws3k@cs.virginia.edu            for(unsigned int i = 0; i < number_requests; ++i)
1665710Scws3k@cs.virginia.edu            {
1672915Sktlim@umich.edu                dis_or_names[i] = "Dis_OR" + (String)i;
1685710Scws3k@cs.virginia.edu                dis_ors[i] = (ElectricalModel*)ModelGen::createModel("OR", dis_or_names[i], getTechModel());
1692623SN/A                dis_ors[i]->setParameter("NumberInputs", number_requests-1);
1702798Sktlim@umich.edu                dis_ors[i]->setParameter("NumberBits", 1);
1712901Ssaidi@eecs.umich.edu                dis_ors[i]->construct();
1722798Sktlim@umich.edu            }
1732798Sktlim@umich.edu
1742798Sktlim@umich.edu            state_count = 0;
1752798Sktlim@umich.edu            for(unsigned int i = 0; i < number_requests; ++i)
1762798Sktlim@umich.edu            {
1775496Ssaidi@eecs.umich.edu                createNet("Dis_OR_Out" + (String)i);
1782798Sktlim@umich.edu                createNet("G_INV_Out" + (String)i);
1795099Ssaidi@eecs.umich.edu                portConnect(g_invs[i], "A", "Dis_OR_Out" + (String)i);
1802867Sktlim@umich.edu                portConnect(g_invs[i], "Y", "G_INV_Out" + (String)i);
1812867Sktlim@umich.edu                portConnect(g_and2s[i], "A", "Request" + (String)i);
1822867Sktlim@umich.edu                portConnect(g_and2s[i], "B", "G_INV_Out" + (String)i);
1835710Scws3k@cs.virginia.edu                portConnect(g_and2s[i], "Y", "Grant" + (String)i);
1845606Snate@binkert.org
1852623SN/A                for(unsigned int j = i + 1; j < number_requests; ++j)
1862623SN/A                {
1872623SN/A                    createNet(String::format("W_INV_Out_%d_%d", i, j));
1882623SN/A                    createNet(String::format("W_OR2_Out_%d_%d", i, j));
1892623SN/A                    createNet(String::format("W_AND2_Out_%d_%d", i, j));
1902623SN/A                    createNet(String::format("W_DFF_Out_%d_%d", i, j));
1914192Sktlim@umich.edu                    portConnect(w_invs[state_count], "A", "Grant" + (String)i);
1922623SN/A                    portConnect(w_invs[state_count], "Y", String::format("W_INV_Out_%d_%d", i, j));
1932680Sktlim@umich.edu                    portConnect(w_or2s[state_count], "A", String::format("W_DFF_Out_%d_%d", i, j));
1942623SN/A                    portConnect(w_or2s[state_count], "B", "Grant" + (String)j);
1952680Sktlim@umich.edu                    portConnect(w_or2s[state_count], "Y", String::format("W_OR2_Out_%d_%d", i, j));
1962680Sktlim@umich.edu                    portConnect(w_and2s[state_count], "A", String::format("W_OR2_Out_%d_%d", i, j));
1972680Sktlim@umich.edu                    portConnect(w_and2s[state_count], "B", String::format("W_INV_Out_%d_%d", i, j));
1982623SN/A                    portConnect(w_and2s[state_count], "Y", String::format("W_AND2_Out_%d_%d", i, j));
1992623SN/A                    portConnect(w_dffs[state_count], "D", String::format("W_AND2_Out_%d_%d", i, j));
2002623SN/A                    portConnect(w_dffs[state_count], "CK", "CK");
2012623SN/A                    portConnect(w_dffs[state_count], "Q", String::format("W_DFF_Out_%d_%d", i, j));
2023201Shsul@eecs.umich.edu
2033201Shsul@eecs.umich.edu                    createNet(String::format("Dis_AND2_Out_%d_%d", i, j));
2043201Shsul@eecs.umich.edu                    createNet(String::format("Dis_AND2_Out_%d_%d", j, i));
2053201Shsul@eecs.umich.edu                    createNet(String::format("Dis_INV_Out_%d_%d", j, i));
2065169Ssaidi@eecs.umich.edu                    portConnect(dis_and2s[state_count], "A", "Request" + (String)i);
2075101Ssaidi@eecs.umich.edu                    portConnect(dis_and2s[state_count], "B", String::format("W_DFF_Out_%d_%d", i, j));
2082623SN/A                    portConnect(dis_and2s[state_count], "Y", String::format("Dis_AND2_Out_%d_%d", i, j));
2092623SN/A
2102623SN/A                    portConnect(dis_invs[state_count], "A", String::format("W_DFF_Out_%d_%d", i, j));
2112623SN/A                    portConnect(dis_invs[state_count], "Y", String::format("Dis_INV_Out_%d_%d", j, i));
2122623SN/A                    portConnect(dis_and2s[state_count + number_states], "A", "Request" + (String)j);
2132623SN/A                    portConnect(dis_and2s[state_count + number_states], "B", String::format("Dis_INV_Out_%d_%d", j, i));
2145221Ssaidi@eecs.umich.edu                    portConnect(dis_and2s[state_count + number_states], "Y", String::format("Dis_AND2_Out_%d_%d", j, i));
2155221Ssaidi@eecs.umich.edu
2162623SN/A                    state_count++;
2172683Sktlim@umich.edu                }
2182623SN/A            }
2192623SN/A            for(unsigned int i = 0; i < number_requests; ++i)
2202623SN/A            {
2212623SN/A                unsigned int k = 0;
2222623SN/A                for(unsigned int j = 0; j < number_requests; ++j)
2233686Sktlim@umich.edu                {
2242623SN/A                    if(i != j)
2255606Snate@binkert.org                    {
2262623SN/A                        portConnect(dis_ors[i], "In" + (String)k, String::format("Dis_AND2_Out_%d_%d", j, i));
2272623SN/A                        k++;
2282623SN/A                    }
2292623SN/A                }
2302623SN/A                portConnect(dis_ors[i], "Out", "Dis_OR_Out" + (String)i);
2312623SN/A            }
2325221Ssaidi@eecs.umich.edu
2335221Ssaidi@eecs.umich.edu            // Add instances
2342623SN/A            for(unsigned int i = 0; i < number_requests; ++i)
2352683Sktlim@umich.edu            {
2362623SN/A                addSubInstances(g_invs[i], 1.0);
2376043Sgblack@eecs.umich.edu                addElectricalSubResults(g_invs[i], 1.0);
2386043Sgblack@eecs.umich.edu                addSubInstances(g_and2s[i], 1.0);
2396043Sgblack@eecs.umich.edu                addElectricalSubResults(g_and2s[i], 1.0);
2402644Sstever@eecs.umich.edu                addSubInstances(dis_ors[i], 1.0);
2412623SN/A                addElectricalSubResults(dis_ors[i], 1.0);
2422644Sstever@eecs.umich.edu            }
2432644Sstever@eecs.umich.edu            for(unsigned int i = 0; i < number_states; ++i)
2442623SN/A            {
2452623SN/A                addSubInstances(w_or2s[i], 1.0);
2462623SN/A                addElectricalSubResults(w_or2s[i], 1.0);
2472623SN/A                addSubInstances(w_and2s[i], 1.0);
2482623SN/A                addElectricalSubResults(w_and2s[i], 1.0);
2495728Sgblack@eecs.umich.edu                addSubInstances(w_invs[i], 1.0);
2505728Sgblack@eecs.umich.edu                addElectricalSubResults(w_invs[i], 1.0);
2515728Sgblack@eecs.umich.edu                addSubInstances(w_dffs[i], 1.0);
2525728Sgblack@eecs.umich.edu                addElectricalSubResults(w_dffs[i], 1.0);
2535728Sgblack@eecs.umich.edu                addSubInstances(dis_and2s[i], 1.0);
2545728Sgblack@eecs.umich.edu                addElectricalSubResults(dis_and2s[i], 1.0);
2555728Sgblack@eecs.umich.edu                addSubInstances(dis_and2s[i + number_states], 1.0);
2565728Sgblack@eecs.umich.edu                addElectricalSubResults(dis_and2s[i + number_states], 1.0);
2575728Sgblack@eecs.umich.edu                addSubInstances(dis_invs[i], 1.0);
2585728Sgblack@eecs.umich.edu                addElectricalSubResults(dis_invs[i], 1.0);
2595728Sgblack@eecs.umich.edu            }
2605728Sgblack@eecs.umich.edu
2615728Sgblack@eecs.umich.edu            // Update event
2625728Sgblack@eecs.umich.edu            //for(unsigned int i = 0; i <= number_requests; ++i)
2635728Sgblack@eecs.umich.edu            //{
2645728Sgblack@eecs.umich.edu            //Result* arb_event = getEventResult("Arbitrate" + (String)i);
2655728Sgblack@eecs.umich.edu            Result* arb_event = getEventResult("Arbitrate");
2665728Sgblack@eecs.umich.edu            for(unsigned int j = 0; j < number_requests; ++j)
2675728Sgblack@eecs.umich.edu            {
2685728Sgblack@eecs.umich.edu                arb_event->addSubResult(g_invs[j]->getEventResult("INV"), g_inv_names[j], 1.0);
2692623SN/A                arb_event->addSubResult(g_and2s[j]->getEventResult("AND2"), g_and2_names[j], 1.0);
2705894Sgblack@eecs.umich.edu                arb_event->addSubResult(dis_ors[j]->getEventResult("OR"), dis_or_names[j], 1.0);
2715894Sgblack@eecs.umich.edu            }
2725894Sgblack@eecs.umich.edu            for(unsigned int j = 0; j < number_states; ++j)
2735744Sgblack@eecs.umich.edu            {
2745894Sgblack@eecs.umich.edu                arb_event->addSubResult(w_or2s[j]->getEventResult("OR2"), w_or2_names[j], 1.0);
2755894Sgblack@eecs.umich.edu                arb_event->addSubResult(w_and2s[j]->getEventResult("AND2"), w_and2_names[j], 1.0);
2765894Sgblack@eecs.umich.edu                arb_event->addSubResult(w_invs[j]->getEventResult("INV"), w_inv_names[j], 1.0);
2775894Sgblack@eecs.umich.edu                arb_event->addSubResult(w_dffs[j]->getEventResult("DFFD"), w_dff_names[j], 1.0);
2785744Sgblack@eecs.umich.edu                arb_event->addSubResult(w_dffs[j]->getEventResult("DFFQ"), w_dff_names[j], 1.0);
2795894Sgblack@eecs.umich.edu                arb_event->addSubResult(w_dffs[j]->getEventResult("CK"), w_dff_names[j], 1.0);
2805894Sgblack@eecs.umich.edu                arb_event->addSubResult(dis_and2s[j]->getEventResult("AND2"), dis_and2_names[j], 1.0);
2815894Sgblack@eecs.umich.edu                arb_event->addSubResult(dis_and2s[j + number_states]->getEventResult("AND2"), dis_and2_names[j + number_states], 1.0);
2825894Sgblack@eecs.umich.edu                arb_event->addSubResult(dis_invs[j]->getEventResult("INV"), dis_inv_names[j], 1.0);
2835894Sgblack@eecs.umich.edu            }
2845894Sgblack@eecs.umich.edu            //}
2855894Sgblack@eecs.umich.edu        }
2865894Sgblack@eecs.umich.edu        return;
2875894Sgblack@eecs.umich.edu    }
2885894Sgblack@eecs.umich.edu
2895894Sgblack@eecs.umich.edu    void MatrixArbiter::propagateTransitionInfo()
2905894Sgblack@eecs.umich.edu    {
2915894Sgblack@eecs.umich.edu        // Get parameters
2925894Sgblack@eecs.umich.edu        unsigned int number_requests = getParameter("NumberRequests").toUInt();
2935894Sgblack@eecs.umich.edu
2946102Sgblack@eecs.umich.edu        if(number_requests == 1)
2955894Sgblack@eecs.umich.edu        {
2965894Sgblack@eecs.umich.edu            propagatePortTransitionInfo("Grant0", "Request0");
2975894Sgblack@eecs.umich.edu        }
2985894Sgblack@eecs.umich.edu        else
2995894Sgblack@eecs.umich.edu        {
3005894Sgblack@eecs.umich.edu            unsigned int number_states = (number_requests - 1) * number_requests / 2;
3015894Sgblack@eecs.umich.edu
3025894Sgblack@eecs.umich.edu            vector<ElectricalModel*> g_and2s(number_requests, NULL);
3035894Sgblack@eecs.umich.edu            vector<ElectricalModel*> g_invs(number_requests, NULL);
3045894Sgblack@eecs.umich.edu            vector<ElectricalModel*> w_invs(number_states, NULL);
3055894Sgblack@eecs.umich.edu            vector<ElectricalModel*> w_or2s(number_states, NULL);
3065894Sgblack@eecs.umich.edu            vector<ElectricalModel*> w_and2s(number_states, NULL);
3075894Sgblack@eecs.umich.edu            vector<ElectricalModel*> w_dffs(number_states, NULL);
3085894Sgblack@eecs.umich.edu            vector<ElectricalModel*> dis_invs(number_states, NULL);
3095894Sgblack@eecs.umich.edu            vector<ElectricalModel*> dis_and2s(number_requests * number_requests, NULL);
3105894Sgblack@eecs.umich.edu            vector<ElectricalModel*> dis_ors(number_requests, NULL);
3115894Sgblack@eecs.umich.edu            for(unsigned int i = 0; i < number_requests; ++i)
3125894Sgblack@eecs.umich.edu            {
3135894Sgblack@eecs.umich.edu                g_and2s[i] = (ElectricalModel*)getSubInstance("G_AND2" + (String)i);
3145894Sgblack@eecs.umich.edu                g_invs[i] = (ElectricalModel*)getSubInstance("G_INV" + (String)i);
3155894Sgblack@eecs.umich.edu                dis_ors[i] = (ElectricalModel*)getSubInstance("Dis_OR" + (String)i);
3165894Sgblack@eecs.umich.edu            }
3175894Sgblack@eecs.umich.edu            unsigned int state_count = 0;
3185894Sgblack@eecs.umich.edu            for(unsigned int i = 0; i < number_requests; ++i)
3195890Sgblack@eecs.umich.edu            {
3205894Sgblack@eecs.umich.edu                for(unsigned int j = i + 1; j < number_requests; ++j)
3215894Sgblack@eecs.umich.edu                {
3225894Sgblack@eecs.umich.edu                    w_invs[state_count] = (ElectricalModel*)getSubInstance(String::format("W_INV_%d_%d", i, j));
3235894Sgblack@eecs.umich.edu                    w_or2s[state_count] = (ElectricalModel*)getSubInstance(String::format("W_OR2_%d_%d", i, j));
3245894Sgblack@eecs.umich.edu                    w_and2s[state_count] = (ElectricalModel*)getSubInstance(String::format("W_AND2_%d_%d", i, j));
3255894Sgblack@eecs.umich.edu                    w_dffs[state_count] = (ElectricalModel*)getSubInstance(String::format("W_DFF_%d_%d", i, j));
3265894Sgblack@eecs.umich.edu                    dis_invs[state_count] = (ElectricalModel*)getSubInstance(String::format("Dis_INV_%d_%d", i, j));
3275894Sgblack@eecs.umich.edu                    dis_and2s[i * number_requests + j] = (ElectricalModel*)getSubInstance(String::format("Dis_AND2_%d_%d", i, j));
3285894Sgblack@eecs.umich.edu                    dis_and2s[j * number_requests + i] = (ElectricalModel*)getSubInstance(String::format("Dis_AND2_%d_%d", j, i));
3295894Sgblack@eecs.umich.edu
3305894Sgblack@eecs.umich.edu                    w_dffs[state_count]->getInputPort("D")->setTransitionInfo(TransitionInfo(0.5, 0.0, 0.5));
3315894Sgblack@eecs.umich.edu                    propagatePortTransitionInfo(w_dffs[state_count], "CK", "CK");
3325894Sgblack@eecs.umich.edu                    w_dffs[state_count]->use();
3335894Sgblack@eecs.umich.edu
3345894Sgblack@eecs.umich.edu                    state_count++;
3355894Sgblack@eecs.umich.edu                }
3365894Sgblack@eecs.umich.edu            }
3375894Sgblack@eecs.umich.edu
3385894Sgblack@eecs.umich.edu            unsigned int iteration = 1;
3395894Sgblack@eecs.umich.edu            unsigned int max_number_iterations = 10;
3405894Sgblack@eecs.umich.edu            //vector<TransitionInfo> trans_vector(number_states, TransitionInfo(0.0, 0.0, 1.0));
3415894Sgblack@eecs.umich.edu            //vector<double> total_P_vector(number_states, 0.0);
3425894Sgblack@eecs.umich.edu            while(iteration < max_number_iterations)
3435894Sgblack@eecs.umich.edu            {
3445894Sgblack@eecs.umich.edu//                for(unsigned int i = 0; i < number_states; ++i)
3455894Sgblack@eecs.umich.edu//                {
3465894Sgblack@eecs.umich.edu//                    w_dffs[i]->getInputPort("D")->setTransitionInfo(trans_vector[i]);
3475894Sgblack@eecs.umich.edu//                    propagatePortTransitionInfo(w_dffs[i], "CK", "CK");
3485894Sgblack@eecs.umich.edu//                    w_dffs[i]->use();
3495894Sgblack@eecs.umich.edu//                }
3505894Sgblack@eecs.umich.edu                state_count = 0;
3515894Sgblack@eecs.umich.edu                for(unsigned int i = 0; i < number_requests; ++i)
3525894Sgblack@eecs.umich.edu                {
3535894Sgblack@eecs.umich.edu                    for(unsigned int j = i + 1; j < number_requests; ++j)
3545894Sgblack@eecs.umich.edu                    {
3555894Sgblack@eecs.umich.edu                        propagatePortTransitionInfo(dis_and2s[i * number_requests + j], "A", "Request" + (String)i);
3565894Sgblack@eecs.umich.edu                        propagatePortTransitionInfo(dis_and2s[i * number_requests + j], "B", w_dffs[state_count], "Q");
3575894Sgblack@eecs.umich.edu                        dis_and2s[i * number_requests + j]->use();
3585894Sgblack@eecs.umich.edu                        propagatePortTransitionInfo(dis_invs[state_count], "A", w_dffs[state_count], "Q");
3595894Sgblack@eecs.umich.edu                        dis_invs[state_count]->use();
3605894Sgblack@eecs.umich.edu                        propagatePortTransitionInfo(dis_and2s[j * number_requests + i], "A", "Request" + (String)j);
3615894Sgblack@eecs.umich.edu                        propagatePortTransitionInfo(dis_and2s[j * number_requests + i], "B", dis_invs[state_count], "Y");
3625894Sgblack@eecs.umich.edu                        dis_and2s[j * number_requests + i]->use();
3635894Sgblack@eecs.umich.edu
3645894Sgblack@eecs.umich.edu                        state_count++;
3655894Sgblack@eecs.umich.edu                    }
3665894Sgblack@eecs.umich.edu                }
3675894Sgblack@eecs.umich.edu                for(unsigned int i = 0; i < number_requests; ++i)
3685894Sgblack@eecs.umich.edu                {
3695894Sgblack@eecs.umich.edu                    unsigned int k = 0;
3705744Sgblack@eecs.umich.edu                    for(unsigned int j = 0; j < number_requests; ++j)
3715744Sgblack@eecs.umich.edu                    {
3725894Sgblack@eecs.umich.edu                        if(i != j)
3735894Sgblack@eecs.umich.edu                        {
3745894Sgblack@eecs.umich.edu                            propagatePortTransitionInfo(dis_ors[i], "In" + (String)k, dis_and2s[j * number_requests + i], "Y");
3755894Sgblack@eecs.umich.edu                            k++;
3765894Sgblack@eecs.umich.edu                        }
3775894Sgblack@eecs.umich.edu                    }
3785894Sgblack@eecs.umich.edu                    dis_ors[i]->use();
3795894Sgblack@eecs.umich.edu                }
3805894Sgblack@eecs.umich.edu                for(unsigned int i = 0; i < number_requests; ++i)
3815894Sgblack@eecs.umich.edu                {
3825894Sgblack@eecs.umich.edu                    propagatePortTransitionInfo(g_invs[i], "A", dis_ors[i], "Out");
3835894Sgblack@eecs.umich.edu                    g_invs[i]->use();
3845894Sgblack@eecs.umich.edu                    propagatePortTransitionInfo(g_and2s[i], "A", "Request" + (String)i);
3855894Sgblack@eecs.umich.edu                    propagatePortTransitionInfo(g_and2s[i], "B", g_invs[i], "Y");
3865894Sgblack@eecs.umich.edu                    g_and2s[i]->use();
3875894Sgblack@eecs.umich.edu                }
3886102Sgblack@eecs.umich.edu                state_count = 0;
3895894Sgblack@eecs.umich.edu                for(unsigned int i = 0; i < number_requests; ++i)
3905894Sgblack@eecs.umich.edu                {
3915894Sgblack@eecs.umich.edu                    for(unsigned int j = i + 1; j < number_requests; ++j)
3926102Sgblack@eecs.umich.edu                    {
3935894Sgblack@eecs.umich.edu                        propagatePortTransitionInfo(w_invs[state_count], "A", g_and2s[i], "Y");
3945894Sgblack@eecs.umich.edu                        w_invs[state_count]->use();
3955894Sgblack@eecs.umich.edu                        propagatePortTransitionInfo(w_or2s[state_count], "A", w_dffs[state_count], "Q");
3965894Sgblack@eecs.umich.edu                        propagatePortTransitionInfo(w_or2s[state_count], "B", g_and2s[j], "Y");
3975894Sgblack@eecs.umich.edu                        w_or2s[state_count]->use();
3985894Sgblack@eecs.umich.edu                        propagatePortTransitionInfo(w_and2s[state_count], "A", w_or2s[state_count], "Y");
3995894Sgblack@eecs.umich.edu                        propagatePortTransitionInfo(w_and2s[state_count], "B", w_invs[state_count], "Y");
4005894Sgblack@eecs.umich.edu                        w_and2s[state_count]->use();
4015894Sgblack@eecs.umich.edu                        propagatePortTransitionInfo(w_dffs[state_count], "D", w_and2s[state_count], "Y");
4025894Sgblack@eecs.umich.edu                        propagatePortTransitionInfo(w_dffs[state_count], "CK", "CK");
4035894Sgblack@eecs.umich.edu                        w_dffs[state_count]->use();
4045894Sgblack@eecs.umich.edu                        state_count++;
4055894Sgblack@eecs.umich.edu                    }
4065894Sgblack@eecs.umich.edu                }
4075894Sgblack@eecs.umich.edu
4085744Sgblack@eecs.umich.edu//                for(unsigned int i = 0; i < number_states; ++i)
4095744Sgblack@eecs.umich.edu//                {
4105894Sgblack@eecs.umich.edu//                    const TransitionInfo& new_trans = w_dffs[i]->getOutputPort("Q")->getTransitionInfo();
4115894Sgblack@eecs.umich.edu//                    total_P_vector[i] += new_trans.getProbability1();
4125894Sgblack@eecs.umich.edu//                    trans_vector[i] = TransitionInfo((1.0 - total_P_vector[i] / iteration) * (1.0 - total_P_vector[i] / iteration),
4135894Sgblack@eecs.umich.edu//                            (1.0 - total_P_vector[i] / iteration) * (total_P_vector[i] / iteration),
4145894Sgblack@eecs.umich.edu//                            (total_P_vector[i] / iteration) * (total_P_vector[i] / iteration));
4155894Sgblack@eecs.umich.edu//                }
4165894Sgblack@eecs.umich.edu//
4175894Sgblack@eecs.umich.edu//                for(unsigned int i = 0; i < number_requests; ++i)
4185744Sgblack@eecs.umich.edu//                {
4195744Sgblack@eecs.umich.edu//                    g_and2s[i]->getOutputPort("Y")->getTransitionInfo().print(cout);
4205744Sgblack@eecs.umich.edu//                }
4215744Sgblack@eecs.umich.edu//                cout << endl;
4225744Sgblack@eecs.umich.edu                iteration++;
4235744Sgblack@eecs.umich.edu            }
4245744Sgblack@eecs.umich.edu
4255744Sgblack@eecs.umich.edu            for(unsigned int i = 0; i < number_requests; ++i)
4265744Sgblack@eecs.umich.edu            {
4275744Sgblack@eecs.umich.edu                propagatePortTransitionInfo("Grant" + (String)i, g_and2s[i], "Y");
4285744Sgblack@eecs.umich.edu            }
4295744Sgblack@eecs.umich.edu        }
4305744Sgblack@eecs.umich.edu
4315744Sgblack@eecs.umich.edu        return;
4325744Sgblack@eecs.umich.edu    }
4335744Sgblack@eecs.umich.edu} // namespace DSENT
4345744Sgblack@eecs.umich.edu
4352623SN/A