110448Snilay@cs.wisc.edu/* Copyright (c) 2012 Massachusetts Institute of Technology
210448Snilay@cs.wisc.edu *
310448Snilay@cs.wisc.edu * Permission is hereby granted, free of charge, to any person obtaining a copy
410448Snilay@cs.wisc.edu * of this software and associated documentation files (the "Software"), to deal
510448Snilay@cs.wisc.edu * in the Software without restriction, including without limitation the rights
610448Snilay@cs.wisc.edu * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
710448Snilay@cs.wisc.edu * copies of the Software, and to permit persons to whom the Software is
810448Snilay@cs.wisc.edu * furnished to do so, subject to the following conditions:
910448Snilay@cs.wisc.edu *
1010448Snilay@cs.wisc.edu * The above copyright notice and this permission notice shall be included in
1110448Snilay@cs.wisc.edu * all copies or substantial portions of the Software.
1210448Snilay@cs.wisc.edu *
1310448Snilay@cs.wisc.edu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1410448Snilay@cs.wisc.edu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1510448Snilay@cs.wisc.edu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
1610448Snilay@cs.wisc.edu * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1710448Snilay@cs.wisc.edu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
1810448Snilay@cs.wisc.edu * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
1910448Snilay@cs.wisc.edu * THE SOFTWARE.
2010448Snilay@cs.wisc.edu */
2110448Snilay@cs.wisc.edu
2210447Snilay@cs.wisc.edu#include "model/electrical/MatrixArbiter.h"
2310447Snilay@cs.wisc.edu
2410447Snilay@cs.wisc.edu#include <cmath>
2510447Snilay@cs.wisc.edu#include <vector>
2610447Snilay@cs.wisc.edu
2710447Snilay@cs.wisc.edu#include "model/PortInfo.h"
2810447Snilay@cs.wisc.edu#include "model/EventInfo.h"
2910447Snilay@cs.wisc.edu#include "model/TransitionInfo.h"
3010447Snilay@cs.wisc.edu#include "model/ModelGen.h"
3110447Snilay@cs.wisc.edu#include "model/std_cells/StdCell.h"
3210447Snilay@cs.wisc.edu#include "model/std_cells/StdCellLib.h"
3310447Snilay@cs.wisc.edu
3410447Snilay@cs.wisc.edunamespace DSENT
3510447Snilay@cs.wisc.edu{
3610447Snilay@cs.wisc.edu    using std::abs;
3710447Snilay@cs.wisc.edu    using std::vector;
3810447Snilay@cs.wisc.edu
3910447Snilay@cs.wisc.edu    MatrixArbiter::MatrixArbiter(const String& instance_name_, const TechModel* tech_model_)
4010447Snilay@cs.wisc.edu        : ElectricalModel(instance_name_, tech_model_)
4110447Snilay@cs.wisc.edu    {
4210447Snilay@cs.wisc.edu        initParameters();
4310447Snilay@cs.wisc.edu        initProperties();
4410447Snilay@cs.wisc.edu    }
4510447Snilay@cs.wisc.edu
4610447Snilay@cs.wisc.edu    MatrixArbiter::~MatrixArbiter()
4710447Snilay@cs.wisc.edu    {}
4810447Snilay@cs.wisc.edu
4910447Snilay@cs.wisc.edu    void MatrixArbiter::initParameters()
5010447Snilay@cs.wisc.edu    {
5110447Snilay@cs.wisc.edu        addParameterName("NumberRequests");
5210447Snilay@cs.wisc.edu        return;
5310447Snilay@cs.wisc.edu    }
5410447Snilay@cs.wisc.edu
5510447Snilay@cs.wisc.edu    void MatrixArbiter::initProperties()
5610447Snilay@cs.wisc.edu    {
5710447Snilay@cs.wisc.edu        return;
5810447Snilay@cs.wisc.edu    }
5910447Snilay@cs.wisc.edu
6010447Snilay@cs.wisc.edu    MatrixArbiter* MatrixArbiter::clone() const
6110447Snilay@cs.wisc.edu    {
6210447Snilay@cs.wisc.edu        // TODO
6310447Snilay@cs.wisc.edu        return NULL;
6410447Snilay@cs.wisc.edu    }
6510447Snilay@cs.wisc.edu
6610447Snilay@cs.wisc.edu    void MatrixArbiter::constructModel()
6710447Snilay@cs.wisc.edu    {
6810447Snilay@cs.wisc.edu        // Get parameters
6910447Snilay@cs.wisc.edu        unsigned int number_requests = getParameter("NumberRequests").toUInt();
7010447Snilay@cs.wisc.edu
7110447Snilay@cs.wisc.edu        ASSERT(number_requests > 0, "[Error] " + getInstanceName() +
7210447Snilay@cs.wisc.edu                " -> Number of requests must be > 0!");
7310447Snilay@cs.wisc.edu
7410447Snilay@cs.wisc.edu        // Connect ports
7510447Snilay@cs.wisc.edu        createInputPort("CK");
7610447Snilay@cs.wisc.edu        for(unsigned int i = 0; i < number_requests; ++i)
7710447Snilay@cs.wisc.edu        {
7810447Snilay@cs.wisc.edu            createInputPort("Request" + (String)i);
7910447Snilay@cs.wisc.edu            createOutputPort("Grant" + (String)i);
8010447Snilay@cs.wisc.edu        }
8110447Snilay@cs.wisc.edu
8210447Snilay@cs.wisc.edu        // Create area, power, event results
8310447Snilay@cs.wisc.edu        createElectricalResults();
8410447Snilay@cs.wisc.edu        getEventInfo("Idle")->setStaticTransitionInfos();
8510447Snilay@cs.wisc.edu        getEventInfo("Idle")->setTransitionInfo("CK", TransitionInfo(0.0, 1.0, 0.0));
8610447Snilay@cs.wisc.edu//        for(unsigned int i = 0; i <= number_requests; ++i)
8710447Snilay@cs.wisc.edu//        {
8810447Snilay@cs.wisc.edu//            // Create arbitrate event with i requests
8910447Snilay@cs.wisc.edu//            createElectricalEventResult("Arbitrate" + (String)i);
9010447Snilay@cs.wisc.edu//            EventInfo* event_info = getEventInfo("Arbitrate" + (String)i);
9110447Snilay@cs.wisc.edu//            event_info->setTransitionInfo("CK", TransitionInfo(0.0, 1.0, 0.0));
9210447Snilay@cs.wisc.edu//
9310447Snilay@cs.wisc.edu//            for(unsigned int j = 0; j < i; ++j)
9410447Snilay@cs.wisc.edu//            {
9510447Snilay@cs.wisc.edu//                event_info->setTransitionInfo("Request" + (String)j, TransitionInfo(0.0, 0.0, 1.0));
9610447Snilay@cs.wisc.edu//            }
9710447Snilay@cs.wisc.edu//            for(unsigned int j = i; j < number_requests; ++j)
9810447Snilay@cs.wisc.edu//            {
9910447Snilay@cs.wisc.edu//                event_info->setTransitionInfo("Request" + (String)j, TransitionInfo(1.0, 0.0, 0.0));
10010447Snilay@cs.wisc.edu//
10110447Snilay@cs.wisc.edu//            }
10210447Snilay@cs.wisc.edu//            //double P_0 = (double)(number_requests - i) / (double)(number_requests);
10310447Snilay@cs.wisc.edu//            //double P_1 = (double)(i) / (double)(number_requests);
10410447Snilay@cs.wisc.edu//            //TransitionInfo trans(P_0 * P_0, P_0 * P_1, P_1 * P_1);
10510447Snilay@cs.wisc.edu//
10610447Snilay@cs.wisc.edu//            //for(unsigned int j = 0; j < number_requests; ++j)
10710447Snilay@cs.wisc.edu//            //{
10810447Snilay@cs.wisc.edu//            //    event_info->setTransitionInfo("Request" + (String)j, trans);
10910447Snilay@cs.wisc.edu//            //}
11010447Snilay@cs.wisc.edu//        }
11110447Snilay@cs.wisc.edu        createElectricalEventResult("Arbitrate");
11210447Snilay@cs.wisc.edu        getEventInfo("Arbitrate")->setTransitionInfo("CK", TransitionInfo(0.0, 1.0, 0.0));
11310447Snilay@cs.wisc.edu        for(unsigned int i = 0; i < number_requests; ++i)
11410447Snilay@cs.wisc.edu        {
11510447Snilay@cs.wisc.edu            getEventInfo("Arbitrate")->setTransitionInfo("Request" + (String)i, TransitionInfo(0.25, 0.25, 0.25));
11610447Snilay@cs.wisc.edu        }
11710447Snilay@cs.wisc.edu
11810447Snilay@cs.wisc.edu        if(number_requests == 1)
11910447Snilay@cs.wisc.edu        {
12010447Snilay@cs.wisc.edu            assign("Grant0", "Request0");
12110447Snilay@cs.wisc.edu        }
12210447Snilay@cs.wisc.edu        else
12310447Snilay@cs.wisc.edu        {
12410447Snilay@cs.wisc.edu            // Init components
12510447Snilay@cs.wisc.edu            vector<String> g_inv_names(number_requests, "");
12610447Snilay@cs.wisc.edu            vector<StdCell*> g_invs(number_requests, NULL);
12710447Snilay@cs.wisc.edu            vector<String> g_and2_names(number_requests, "");
12810447Snilay@cs.wisc.edu            vector<StdCell*> g_and2s(number_requests, NULL);
12910447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < number_requests; ++i)
13010447Snilay@cs.wisc.edu            {
13110447Snilay@cs.wisc.edu                g_inv_names[i] = "G_INV" + (String)i;
13210447Snilay@cs.wisc.edu                g_and2_names[i] = "G_AND2" + (String)i;
13310447Snilay@cs.wisc.edu                g_invs[i] = getTechModel()->getStdCellLib()->createStdCell("INV", g_inv_names[i]);
13410447Snilay@cs.wisc.edu                g_invs[i]->construct();
13510447Snilay@cs.wisc.edu                g_and2s[i] = getTechModel()->getStdCellLib()->createStdCell("AND2", g_and2_names[i]);
13610447Snilay@cs.wisc.edu                g_and2s[i]->construct();
13710447Snilay@cs.wisc.edu            }
13810447Snilay@cs.wisc.edu
13910447Snilay@cs.wisc.edu            unsigned int number_states = (number_requests - 1) * number_requests / 2;
14010447Snilay@cs.wisc.edu
14110447Snilay@cs.wisc.edu            vector<String> w_or2_names(number_states, "");
14210447Snilay@cs.wisc.edu            vector<StdCell*> w_or2s(number_states, NULL);
14310447Snilay@cs.wisc.edu            vector<String> w_and2_names(number_states, "");
14410447Snilay@cs.wisc.edu            vector<StdCell*> w_and2s(number_states, NULL);
14510447Snilay@cs.wisc.edu            vector<String> w_inv_names(number_states, "");
14610447Snilay@cs.wisc.edu            vector<StdCell*> w_invs(number_states, NULL);
14710447Snilay@cs.wisc.edu            vector<String> w_dff_names(number_states, "");
14810447Snilay@cs.wisc.edu            vector<StdCell*> w_dffs(number_states, NULL);
14910447Snilay@cs.wisc.edu            vector<String> dis_and2_names(number_states * 2, "");
15010447Snilay@cs.wisc.edu            vector<StdCell*> dis_and2s(number_states * 2, NULL);
15110447Snilay@cs.wisc.edu            vector<String> dis_inv_names(number_states, "");
15210447Snilay@cs.wisc.edu            vector<StdCell*> dis_invs(number_states, NULL);
15310447Snilay@cs.wisc.edu            unsigned int state_count = 0;
15410447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < number_requests; ++i)
15510447Snilay@cs.wisc.edu            {
15610447Snilay@cs.wisc.edu                for(unsigned int j = i + 1; j < number_requests; ++j)
15710447Snilay@cs.wisc.edu                {
15810447Snilay@cs.wisc.edu                    w_or2_names[state_count] = String::format("W_OR2_%d_%d", i, j);
15910447Snilay@cs.wisc.edu                    w_and2_names[state_count] = String::format("W_AND2_%d_%d", i, j);
16010447Snilay@cs.wisc.edu                    w_inv_names[state_count] = String::format("W_INV_%d_%d", i, j);
16110447Snilay@cs.wisc.edu                    w_dff_names[state_count] = String::format("W_DFF_%d_%d", i, j);
16210447Snilay@cs.wisc.edu                    w_or2s[state_count] = getTechModel()->getStdCellLib()->createStdCell("OR2", w_or2_names[state_count]);
16310447Snilay@cs.wisc.edu                    w_or2s[state_count]->construct();
16410447Snilay@cs.wisc.edu                    w_and2s[state_count] = getTechModel()->getStdCellLib()->createStdCell("AND2", w_and2_names[state_count]);
16510447Snilay@cs.wisc.edu                    w_and2s[state_count]->construct();
16610447Snilay@cs.wisc.edu                    w_invs[state_count] = getTechModel()->getStdCellLib()->createStdCell("INV", w_inv_names[state_count]);
16710447Snilay@cs.wisc.edu                    w_invs[state_count]->construct();
16810447Snilay@cs.wisc.edu                    w_dffs[state_count] = getTechModel()->getStdCellLib()->createStdCell("DFFQ", w_dff_names[state_count]);
16910447Snilay@cs.wisc.edu                    w_dffs[state_count]->construct();
17010447Snilay@cs.wisc.edu
17110447Snilay@cs.wisc.edu                    dis_inv_names[state_count] = String::format("Dis_INV_%d_%d", i, j);
17210447Snilay@cs.wisc.edu                    dis_and2_names[state_count] = String::format("Dis_AND2_%d_%d", i, j);
17310447Snilay@cs.wisc.edu                    dis_and2_names[state_count + number_states] = String::format("Dis_AND2_%d_%d", j, i);
17410447Snilay@cs.wisc.edu                    dis_invs[state_count] = getTechModel()->getStdCellLib()->createStdCell("INV", dis_inv_names[state_count]);
17510447Snilay@cs.wisc.edu                    dis_invs[state_count]->construct();
17610447Snilay@cs.wisc.edu                    dis_and2s[state_count] = getTechModel()->getStdCellLib()->createStdCell("AND2", dis_and2_names[state_count]);
17710447Snilay@cs.wisc.edu                    dis_and2s[state_count]->construct();
17810447Snilay@cs.wisc.edu                    dis_and2s[state_count + number_states] = getTechModel()->getStdCellLib()->createStdCell("AND2", dis_and2_names[state_count + number_states]);
17910447Snilay@cs.wisc.edu                    dis_and2s[state_count + number_states]->construct();
18010447Snilay@cs.wisc.edu                    state_count++;
18110447Snilay@cs.wisc.edu                }
18210447Snilay@cs.wisc.edu            }
18310447Snilay@cs.wisc.edu
18410447Snilay@cs.wisc.edu            vector<String> dis_or_names(number_requests, "");
18510447Snilay@cs.wisc.edu            vector<ElectricalModel*> dis_ors(number_requests, NULL);
18610447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < number_requests; ++i)
18710447Snilay@cs.wisc.edu            {
18810447Snilay@cs.wisc.edu                dis_or_names[i] = "Dis_OR" + (String)i;
18910447Snilay@cs.wisc.edu                dis_ors[i] = (ElectricalModel*)ModelGen::createModel("OR", dis_or_names[i], getTechModel());
19010447Snilay@cs.wisc.edu                dis_ors[i]->setParameter("NumberInputs", number_requests-1);
19110447Snilay@cs.wisc.edu                dis_ors[i]->setParameter("NumberBits", 1);
19210447Snilay@cs.wisc.edu                dis_ors[i]->construct();
19310447Snilay@cs.wisc.edu            }
19410447Snilay@cs.wisc.edu
19510447Snilay@cs.wisc.edu            state_count = 0;
19610447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < number_requests; ++i)
19710447Snilay@cs.wisc.edu            {
19810447Snilay@cs.wisc.edu                createNet("Dis_OR_Out" + (String)i);
19910447Snilay@cs.wisc.edu                createNet("G_INV_Out" + (String)i);
20010447Snilay@cs.wisc.edu                portConnect(g_invs[i], "A", "Dis_OR_Out" + (String)i);
20110447Snilay@cs.wisc.edu                portConnect(g_invs[i], "Y", "G_INV_Out" + (String)i);
20210447Snilay@cs.wisc.edu                portConnect(g_and2s[i], "A", "Request" + (String)i);
20310447Snilay@cs.wisc.edu                portConnect(g_and2s[i], "B", "G_INV_Out" + (String)i);
20410447Snilay@cs.wisc.edu                portConnect(g_and2s[i], "Y", "Grant" + (String)i);
20510447Snilay@cs.wisc.edu
20610447Snilay@cs.wisc.edu                for(unsigned int j = i + 1; j < number_requests; ++j)
20710447Snilay@cs.wisc.edu                {
20810447Snilay@cs.wisc.edu                    createNet(String::format("W_INV_Out_%d_%d", i, j));
20910447Snilay@cs.wisc.edu                    createNet(String::format("W_OR2_Out_%d_%d", i, j));
21010447Snilay@cs.wisc.edu                    createNet(String::format("W_AND2_Out_%d_%d", i, j));
21110447Snilay@cs.wisc.edu                    createNet(String::format("W_DFF_Out_%d_%d", i, j));
21210447Snilay@cs.wisc.edu                    portConnect(w_invs[state_count], "A", "Grant" + (String)i);
21310447Snilay@cs.wisc.edu                    portConnect(w_invs[state_count], "Y", String::format("W_INV_Out_%d_%d", i, j));
21410447Snilay@cs.wisc.edu                    portConnect(w_or2s[state_count], "A", String::format("W_DFF_Out_%d_%d", i, j));
21510447Snilay@cs.wisc.edu                    portConnect(w_or2s[state_count], "B", "Grant" + (String)j);
21610447Snilay@cs.wisc.edu                    portConnect(w_or2s[state_count], "Y", String::format("W_OR2_Out_%d_%d", i, j));
21710447Snilay@cs.wisc.edu                    portConnect(w_and2s[state_count], "A", String::format("W_OR2_Out_%d_%d", i, j));
21810447Snilay@cs.wisc.edu                    portConnect(w_and2s[state_count], "B", String::format("W_INV_Out_%d_%d", i, j));
21910447Snilay@cs.wisc.edu                    portConnect(w_and2s[state_count], "Y", String::format("W_AND2_Out_%d_%d", i, j));
22010447Snilay@cs.wisc.edu                    portConnect(w_dffs[state_count], "D", String::format("W_AND2_Out_%d_%d", i, j));
22110447Snilay@cs.wisc.edu                    portConnect(w_dffs[state_count], "CK", "CK");
22210447Snilay@cs.wisc.edu                    portConnect(w_dffs[state_count], "Q", String::format("W_DFF_Out_%d_%d", i, j));
22310447Snilay@cs.wisc.edu
22410447Snilay@cs.wisc.edu                    createNet(String::format("Dis_AND2_Out_%d_%d", i, j));
22510447Snilay@cs.wisc.edu                    createNet(String::format("Dis_AND2_Out_%d_%d", j, i));
22610447Snilay@cs.wisc.edu                    createNet(String::format("Dis_INV_Out_%d_%d", j, i));
22710447Snilay@cs.wisc.edu                    portConnect(dis_and2s[state_count], "A", "Request" + (String)i);
22810447Snilay@cs.wisc.edu                    portConnect(dis_and2s[state_count], "B", String::format("W_DFF_Out_%d_%d", i, j));
22910447Snilay@cs.wisc.edu                    portConnect(dis_and2s[state_count], "Y", String::format("Dis_AND2_Out_%d_%d", i, j));
23010447Snilay@cs.wisc.edu
23110447Snilay@cs.wisc.edu                    portConnect(dis_invs[state_count], "A", String::format("W_DFF_Out_%d_%d", i, j));
23210447Snilay@cs.wisc.edu                    portConnect(dis_invs[state_count], "Y", String::format("Dis_INV_Out_%d_%d", j, i));
23310447Snilay@cs.wisc.edu                    portConnect(dis_and2s[state_count + number_states], "A", "Request" + (String)j);
23410447Snilay@cs.wisc.edu                    portConnect(dis_and2s[state_count + number_states], "B", String::format("Dis_INV_Out_%d_%d", j, i));
23510447Snilay@cs.wisc.edu                    portConnect(dis_and2s[state_count + number_states], "Y", String::format("Dis_AND2_Out_%d_%d", j, i));
23610447Snilay@cs.wisc.edu
23710447Snilay@cs.wisc.edu                    state_count++;
23810447Snilay@cs.wisc.edu                }
23910447Snilay@cs.wisc.edu            }
24010447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < number_requests; ++i)
24110447Snilay@cs.wisc.edu            {
24210447Snilay@cs.wisc.edu                unsigned int k = 0;
24310447Snilay@cs.wisc.edu                for(unsigned int j = 0; j < number_requests; ++j)
24410447Snilay@cs.wisc.edu                {
24510447Snilay@cs.wisc.edu                    if(i != j)
24610447Snilay@cs.wisc.edu                    {
24710447Snilay@cs.wisc.edu                        portConnect(dis_ors[i], "In" + (String)k, String::format("Dis_AND2_Out_%d_%d", j, i));
24810447Snilay@cs.wisc.edu                        k++;
24910447Snilay@cs.wisc.edu                    }
25010447Snilay@cs.wisc.edu                }
25110447Snilay@cs.wisc.edu                portConnect(dis_ors[i], "Out", "Dis_OR_Out" + (String)i);
25210447Snilay@cs.wisc.edu            }
25310447Snilay@cs.wisc.edu
25410447Snilay@cs.wisc.edu            // Add instances
25510447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < number_requests; ++i)
25610447Snilay@cs.wisc.edu            {
25710447Snilay@cs.wisc.edu                addSubInstances(g_invs[i], 1.0);
25810447Snilay@cs.wisc.edu                addElectricalSubResults(g_invs[i], 1.0);
25910447Snilay@cs.wisc.edu                addSubInstances(g_and2s[i], 1.0);
26010447Snilay@cs.wisc.edu                addElectricalSubResults(g_and2s[i], 1.0);
26110447Snilay@cs.wisc.edu                addSubInstances(dis_ors[i], 1.0);
26210447Snilay@cs.wisc.edu                addElectricalSubResults(dis_ors[i], 1.0);
26310447Snilay@cs.wisc.edu            }
26410447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < number_states; ++i)
26510447Snilay@cs.wisc.edu            {
26610447Snilay@cs.wisc.edu                addSubInstances(w_or2s[i], 1.0);
26710447Snilay@cs.wisc.edu                addElectricalSubResults(w_or2s[i], 1.0);
26810447Snilay@cs.wisc.edu                addSubInstances(w_and2s[i], 1.0);
26910447Snilay@cs.wisc.edu                addElectricalSubResults(w_and2s[i], 1.0);
27010447Snilay@cs.wisc.edu                addSubInstances(w_invs[i], 1.0);
27110447Snilay@cs.wisc.edu                addElectricalSubResults(w_invs[i], 1.0);
27210447Snilay@cs.wisc.edu                addSubInstances(w_dffs[i], 1.0);
27310447Snilay@cs.wisc.edu                addElectricalSubResults(w_dffs[i], 1.0);
27410447Snilay@cs.wisc.edu                addSubInstances(dis_and2s[i], 1.0);
27510447Snilay@cs.wisc.edu                addElectricalSubResults(dis_and2s[i], 1.0);
27610447Snilay@cs.wisc.edu                addSubInstances(dis_and2s[i + number_states], 1.0);
27710447Snilay@cs.wisc.edu                addElectricalSubResults(dis_and2s[i + number_states], 1.0);
27810447Snilay@cs.wisc.edu                addSubInstances(dis_invs[i], 1.0);
27910447Snilay@cs.wisc.edu                addElectricalSubResults(dis_invs[i], 1.0);
28010447Snilay@cs.wisc.edu            }
28110447Snilay@cs.wisc.edu
28210447Snilay@cs.wisc.edu            // Update event
28310447Snilay@cs.wisc.edu            //for(unsigned int i = 0; i <= number_requests; ++i)
28410447Snilay@cs.wisc.edu            //{
28510447Snilay@cs.wisc.edu            //Result* arb_event = getEventResult("Arbitrate" + (String)i);
28610447Snilay@cs.wisc.edu            Result* arb_event = getEventResult("Arbitrate");
28710447Snilay@cs.wisc.edu            for(unsigned int j = 0; j < number_requests; ++j)
28810447Snilay@cs.wisc.edu            {
28910447Snilay@cs.wisc.edu                arb_event->addSubResult(g_invs[j]->getEventResult("INV"), g_inv_names[j], 1.0);
29010447Snilay@cs.wisc.edu                arb_event->addSubResult(g_and2s[j]->getEventResult("AND2"), g_and2_names[j], 1.0);
29110447Snilay@cs.wisc.edu                arb_event->addSubResult(dis_ors[j]->getEventResult("OR"), dis_or_names[j], 1.0);
29210447Snilay@cs.wisc.edu            }
29310447Snilay@cs.wisc.edu            for(unsigned int j = 0; j < number_states; ++j)
29410447Snilay@cs.wisc.edu            {
29510447Snilay@cs.wisc.edu                arb_event->addSubResult(w_or2s[j]->getEventResult("OR2"), w_or2_names[j], 1.0);
29610447Snilay@cs.wisc.edu                arb_event->addSubResult(w_and2s[j]->getEventResult("AND2"), w_and2_names[j], 1.0);
29710447Snilay@cs.wisc.edu                arb_event->addSubResult(w_invs[j]->getEventResult("INV"), w_inv_names[j], 1.0);
29810447Snilay@cs.wisc.edu                arb_event->addSubResult(w_dffs[j]->getEventResult("DFFD"), w_dff_names[j], 1.0);
29910447Snilay@cs.wisc.edu                arb_event->addSubResult(w_dffs[j]->getEventResult("DFFQ"), w_dff_names[j], 1.0);
30010447Snilay@cs.wisc.edu                arb_event->addSubResult(w_dffs[j]->getEventResult("CK"), w_dff_names[j], 1.0);
30110447Snilay@cs.wisc.edu                arb_event->addSubResult(dis_and2s[j]->getEventResult("AND2"), dis_and2_names[j], 1.0);
30210447Snilay@cs.wisc.edu                arb_event->addSubResult(dis_and2s[j + number_states]->getEventResult("AND2"), dis_and2_names[j + number_states], 1.0);
30310447Snilay@cs.wisc.edu                arb_event->addSubResult(dis_invs[j]->getEventResult("INV"), dis_inv_names[j], 1.0);
30410447Snilay@cs.wisc.edu            }
30510447Snilay@cs.wisc.edu            //}
30610447Snilay@cs.wisc.edu        }
30710447Snilay@cs.wisc.edu        return;
30810447Snilay@cs.wisc.edu    }
30910447Snilay@cs.wisc.edu
31010447Snilay@cs.wisc.edu    void MatrixArbiter::propagateTransitionInfo()
31110447Snilay@cs.wisc.edu    {
31210447Snilay@cs.wisc.edu        // Get parameters
31310447Snilay@cs.wisc.edu        unsigned int number_requests = getParameter("NumberRequests").toUInt();
31410447Snilay@cs.wisc.edu
31510447Snilay@cs.wisc.edu        if(number_requests == 1)
31610447Snilay@cs.wisc.edu        {
31710447Snilay@cs.wisc.edu            propagatePortTransitionInfo("Grant0", "Request0");
31810447Snilay@cs.wisc.edu        }
31910447Snilay@cs.wisc.edu        else
32010447Snilay@cs.wisc.edu        {
32110447Snilay@cs.wisc.edu            unsigned int number_states = (number_requests - 1) * number_requests / 2;
32210447Snilay@cs.wisc.edu
32310447Snilay@cs.wisc.edu            vector<ElectricalModel*> g_and2s(number_requests, NULL);
32410447Snilay@cs.wisc.edu            vector<ElectricalModel*> g_invs(number_requests, NULL);
32510447Snilay@cs.wisc.edu            vector<ElectricalModel*> w_invs(number_states, NULL);
32610447Snilay@cs.wisc.edu            vector<ElectricalModel*> w_or2s(number_states, NULL);
32710447Snilay@cs.wisc.edu            vector<ElectricalModel*> w_and2s(number_states, NULL);
32810447Snilay@cs.wisc.edu            vector<ElectricalModel*> w_dffs(number_states, NULL);
32910447Snilay@cs.wisc.edu            vector<ElectricalModel*> dis_invs(number_states, NULL);
33010447Snilay@cs.wisc.edu            vector<ElectricalModel*> dis_and2s(number_requests * number_requests, NULL);
33110447Snilay@cs.wisc.edu            vector<ElectricalModel*> dis_ors(number_requests, NULL);
33210447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < number_requests; ++i)
33310447Snilay@cs.wisc.edu            {
33410447Snilay@cs.wisc.edu                g_and2s[i] = (ElectricalModel*)getSubInstance("G_AND2" + (String)i);
33510447Snilay@cs.wisc.edu                g_invs[i] = (ElectricalModel*)getSubInstance("G_INV" + (String)i);
33610447Snilay@cs.wisc.edu                dis_ors[i] = (ElectricalModel*)getSubInstance("Dis_OR" + (String)i);
33710447Snilay@cs.wisc.edu            }
33810447Snilay@cs.wisc.edu            unsigned int state_count = 0;
33910447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < number_requests; ++i)
34010447Snilay@cs.wisc.edu            {
34110447Snilay@cs.wisc.edu                for(unsigned int j = i + 1; j < number_requests; ++j)
34210447Snilay@cs.wisc.edu                {
34310447Snilay@cs.wisc.edu                    w_invs[state_count] = (ElectricalModel*)getSubInstance(String::format("W_INV_%d_%d", i, j));
34410447Snilay@cs.wisc.edu                    w_or2s[state_count] = (ElectricalModel*)getSubInstance(String::format("W_OR2_%d_%d", i, j));
34510447Snilay@cs.wisc.edu                    w_and2s[state_count] = (ElectricalModel*)getSubInstance(String::format("W_AND2_%d_%d", i, j));
34610447Snilay@cs.wisc.edu                    w_dffs[state_count] = (ElectricalModel*)getSubInstance(String::format("W_DFF_%d_%d", i, j));
34710447Snilay@cs.wisc.edu                    dis_invs[state_count] = (ElectricalModel*)getSubInstance(String::format("Dis_INV_%d_%d", i, j));
34810447Snilay@cs.wisc.edu                    dis_and2s[i * number_requests + j] = (ElectricalModel*)getSubInstance(String::format("Dis_AND2_%d_%d", i, j));
34910447Snilay@cs.wisc.edu                    dis_and2s[j * number_requests + i] = (ElectricalModel*)getSubInstance(String::format("Dis_AND2_%d_%d", j, i));
35010447Snilay@cs.wisc.edu
35110447Snilay@cs.wisc.edu                    w_dffs[state_count]->getInputPort("D")->setTransitionInfo(TransitionInfo(0.5, 0.0, 0.5));
35210447Snilay@cs.wisc.edu                    propagatePortTransitionInfo(w_dffs[state_count], "CK", "CK");
35310447Snilay@cs.wisc.edu                    w_dffs[state_count]->use();
35410447Snilay@cs.wisc.edu
35510447Snilay@cs.wisc.edu                    state_count++;
35610447Snilay@cs.wisc.edu                }
35710447Snilay@cs.wisc.edu            }
35810447Snilay@cs.wisc.edu
35910447Snilay@cs.wisc.edu            unsigned int iteration = 1;
36010447Snilay@cs.wisc.edu            unsigned int max_number_iterations = 10;
36110447Snilay@cs.wisc.edu            //vector<TransitionInfo> trans_vector(number_states, TransitionInfo(0.0, 0.0, 1.0));
36210447Snilay@cs.wisc.edu            //vector<double> total_P_vector(number_states, 0.0);
36310447Snilay@cs.wisc.edu            while(iteration < max_number_iterations)
36410447Snilay@cs.wisc.edu            {
36510447Snilay@cs.wisc.edu//                for(unsigned int i = 0; i < number_states; ++i)
36610447Snilay@cs.wisc.edu//                {
36710447Snilay@cs.wisc.edu//                    w_dffs[i]->getInputPort("D")->setTransitionInfo(trans_vector[i]);
36810447Snilay@cs.wisc.edu//                    propagatePortTransitionInfo(w_dffs[i], "CK", "CK");
36910447Snilay@cs.wisc.edu//                    w_dffs[i]->use();
37010447Snilay@cs.wisc.edu//                }
37110447Snilay@cs.wisc.edu                state_count = 0;
37210447Snilay@cs.wisc.edu                for(unsigned int i = 0; i < number_requests; ++i)
37310447Snilay@cs.wisc.edu                {
37410447Snilay@cs.wisc.edu                    for(unsigned int j = i + 1; j < number_requests; ++j)
37510447Snilay@cs.wisc.edu                    {
37610447Snilay@cs.wisc.edu                        propagatePortTransitionInfo(dis_and2s[i * number_requests + j], "A", "Request" + (String)i);
37710447Snilay@cs.wisc.edu                        propagatePortTransitionInfo(dis_and2s[i * number_requests + j], "B", w_dffs[state_count], "Q");
37810447Snilay@cs.wisc.edu                        dis_and2s[i * number_requests + j]->use();
37910447Snilay@cs.wisc.edu                        propagatePortTransitionInfo(dis_invs[state_count], "A", w_dffs[state_count], "Q");
38010447Snilay@cs.wisc.edu                        dis_invs[state_count]->use();
38110447Snilay@cs.wisc.edu                        propagatePortTransitionInfo(dis_and2s[j * number_requests + i], "A", "Request" + (String)j);
38210447Snilay@cs.wisc.edu                        propagatePortTransitionInfo(dis_and2s[j * number_requests + i], "B", dis_invs[state_count], "Y");
38310447Snilay@cs.wisc.edu                        dis_and2s[j * number_requests + i]->use();
38410447Snilay@cs.wisc.edu
38510447Snilay@cs.wisc.edu                        state_count++;
38610447Snilay@cs.wisc.edu                    }
38710447Snilay@cs.wisc.edu                }
38810447Snilay@cs.wisc.edu                for(unsigned int i = 0; i < number_requests; ++i)
38910447Snilay@cs.wisc.edu                {
39010447Snilay@cs.wisc.edu                    unsigned int k = 0;
39110447Snilay@cs.wisc.edu                    for(unsigned int j = 0; j < number_requests; ++j)
39210447Snilay@cs.wisc.edu                    {
39310447Snilay@cs.wisc.edu                        if(i != j)
39410447Snilay@cs.wisc.edu                        {
39510447Snilay@cs.wisc.edu                            propagatePortTransitionInfo(dis_ors[i], "In" + (String)k, dis_and2s[j * number_requests + i], "Y");
39610447Snilay@cs.wisc.edu                            k++;
39710447Snilay@cs.wisc.edu                        }
39810447Snilay@cs.wisc.edu                    }
39910447Snilay@cs.wisc.edu                    dis_ors[i]->use();
40010447Snilay@cs.wisc.edu                }
40110447Snilay@cs.wisc.edu                for(unsigned int i = 0; i < number_requests; ++i)
40210447Snilay@cs.wisc.edu                {
40310447Snilay@cs.wisc.edu                    propagatePortTransitionInfo(g_invs[i], "A", dis_ors[i], "Out");
40410447Snilay@cs.wisc.edu                    g_invs[i]->use();
40510447Snilay@cs.wisc.edu                    propagatePortTransitionInfo(g_and2s[i], "A", "Request" + (String)i);
40610447Snilay@cs.wisc.edu                    propagatePortTransitionInfo(g_and2s[i], "B", g_invs[i], "Y");
40710447Snilay@cs.wisc.edu                    g_and2s[i]->use();
40810447Snilay@cs.wisc.edu                }
40910447Snilay@cs.wisc.edu                state_count = 0;
41010447Snilay@cs.wisc.edu                for(unsigned int i = 0; i < number_requests; ++i)
41110447Snilay@cs.wisc.edu                {
41210447Snilay@cs.wisc.edu                    for(unsigned int j = i + 1; j < number_requests; ++j)
41310447Snilay@cs.wisc.edu                    {
41410447Snilay@cs.wisc.edu                        propagatePortTransitionInfo(w_invs[state_count], "A", g_and2s[i], "Y");
41510447Snilay@cs.wisc.edu                        w_invs[state_count]->use();
41610447Snilay@cs.wisc.edu                        propagatePortTransitionInfo(w_or2s[state_count], "A", w_dffs[state_count], "Q");
41710447Snilay@cs.wisc.edu                        propagatePortTransitionInfo(w_or2s[state_count], "B", g_and2s[j], "Y");
41810447Snilay@cs.wisc.edu                        w_or2s[state_count]->use();
41910447Snilay@cs.wisc.edu                        propagatePortTransitionInfo(w_and2s[state_count], "A", w_or2s[state_count], "Y");
42010447Snilay@cs.wisc.edu                        propagatePortTransitionInfo(w_and2s[state_count], "B", w_invs[state_count], "Y");
42110447Snilay@cs.wisc.edu                        w_and2s[state_count]->use();
42210447Snilay@cs.wisc.edu                        propagatePortTransitionInfo(w_dffs[state_count], "D", w_and2s[state_count], "Y");
42310447Snilay@cs.wisc.edu                        propagatePortTransitionInfo(w_dffs[state_count], "CK", "CK");
42410447Snilay@cs.wisc.edu                        w_dffs[state_count]->use();
42510447Snilay@cs.wisc.edu                        state_count++;
42610447Snilay@cs.wisc.edu                    }
42710447Snilay@cs.wisc.edu                }
42810447Snilay@cs.wisc.edu
42910447Snilay@cs.wisc.edu//                for(unsigned int i = 0; i < number_states; ++i)
43010447Snilay@cs.wisc.edu//                {
43110447Snilay@cs.wisc.edu//                    const TransitionInfo& new_trans = w_dffs[i]->getOutputPort("Q")->getTransitionInfo();
43210447Snilay@cs.wisc.edu//                    total_P_vector[i] += new_trans.getProbability1();
43310447Snilay@cs.wisc.edu//                    trans_vector[i] = TransitionInfo((1.0 - total_P_vector[i] / iteration) * (1.0 - total_P_vector[i] / iteration),
43410447Snilay@cs.wisc.edu//                            (1.0 - total_P_vector[i] / iteration) * (total_P_vector[i] / iteration),
43510447Snilay@cs.wisc.edu//                            (total_P_vector[i] / iteration) * (total_P_vector[i] / iteration));
43610447Snilay@cs.wisc.edu//                }
43710447Snilay@cs.wisc.edu//
43810447Snilay@cs.wisc.edu//                for(unsigned int i = 0; i < number_requests; ++i)
43910447Snilay@cs.wisc.edu//                {
44010447Snilay@cs.wisc.edu//                    g_and2s[i]->getOutputPort("Y")->getTransitionInfo().print(cout);
44110447Snilay@cs.wisc.edu//                }
44210447Snilay@cs.wisc.edu//                cout << endl;
44310447Snilay@cs.wisc.edu                iteration++;
44410447Snilay@cs.wisc.edu            }
44510447Snilay@cs.wisc.edu
44610447Snilay@cs.wisc.edu            for(unsigned int i = 0; i < number_requests; ++i)
44710447Snilay@cs.wisc.edu            {
44810447Snilay@cs.wisc.edu                propagatePortTransitionInfo("Grant" + (String)i, g_and2s[i], "Y");
44910447Snilay@cs.wisc.edu            }
45010447Snilay@cs.wisc.edu        }
45110447Snilay@cs.wisc.edu
45210447Snilay@cs.wisc.edu        return;
45310447Snilay@cs.wisc.edu    }
45410447Snilay@cs.wisc.edu} // namespace DSENT
45510447Snilay@cs.wisc.edu
456