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