summaryrefslogtreecommitdiff
path: root/src/mem/slicc/symbols/StateMachine.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/slicc/symbols/StateMachine.cc')
-rw-r--r--src/mem/slicc/symbols/StateMachine.cc1481
1 files changed, 0 insertions, 1481 deletions
diff --git a/src/mem/slicc/symbols/StateMachine.cc b/src/mem/slicc/symbols/StateMachine.cc
deleted file mode 100644
index 0edfedc43..000000000
--- a/src/mem/slicc/symbols/StateMachine.cc
+++ /dev/null
@@ -1,1481 +0,0 @@
-
-/*
- * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-/*
- * $Id$
- *
- * */
-
-#include "mem/slicc/symbols/StateMachine.hh"
-#include "mem/slicc/generator/fileio.hh"
-#include "mem/slicc/generator/html_gen.hh"
-#include "mem/slicc/symbols/Action.hh"
-#include "mem/slicc/symbols/Event.hh"
-#include "mem/slicc/symbols/State.hh"
-#include "mem/slicc/symbols/Transition.hh"
-#include "mem/slicc/symbols/Var.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-#include "mem/gems_common/util.hh"
-#include "mem/gems_common/Vector.hh"
-#include "mem/slicc/ast/FormalParamAST.hh"
-
-#include <set>
-
-StateMachine::StateMachine(string ident, const Location& location, const Map<string, string>& pairs, Vector<FormalParamAST*>* config_parameters)
- : Symbol(ident, location, pairs)
-{
- m_table_built = false;
- m_config_parameters = config_parameters;
-
- for (int i=0; i< m_config_parameters->size(); i++) {
- Var* var = new Var(m_config_parameters->ref(i)->getName(),
- location,
- m_config_parameters->ref(i)->getType(),
- "m_"+m_config_parameters->ref(i)->getName(),
- Map<string, string>(),
- this);
- g_sym_table.registerSym(m_config_parameters->ref(i)->getName(), var);
- }
-}
-
-StateMachine::~StateMachine()
-{
- // FIXME
- // assert(0);
-}
-
-void StateMachine::addState(State* state_ptr)
-{
- assert(m_table_built == false);
- m_state_map.add(state_ptr, m_states.size());
- m_states.insertAtBottom(state_ptr);
-}
-
-void StateMachine::addEvent(Event* event_ptr)
-{
- assert(m_table_built == false);
- m_event_map.add(event_ptr, m_events.size());
- m_events.insertAtBottom(event_ptr);
-}
-
-void StateMachine::addAction(Action* action_ptr)
-{
- assert(m_table_built == false);
-
- // Check for duplicate action
- int size = m_actions.size();
- for(int i=0; i<size; i++) {
- if (m_actions[i]->getIdent() == action_ptr->getIdent()) {
- m_actions[i]->warning("Duplicate action definition: " + m_actions[i]->getIdent());
- action_ptr->error("Duplicate action definition: " + action_ptr->getIdent());
- }
- if (m_actions[i]->getShorthand() == action_ptr->getShorthand()) {
- m_actions[i]->warning("Duplicate action shorthand: " + m_actions[i]->getIdent());
- m_actions[i]->warning(" shorthand = " + m_actions[i]->getShorthand());
- action_ptr->warning("Duplicate action shorthand: " + action_ptr->getIdent());
- action_ptr->error(" shorthand = " + action_ptr->getShorthand());
- }
- }
-
- m_actions.insertAtBottom(action_ptr);
-}
-
-void StateMachine::addTransition(Transition* trans_ptr)
-{
- assert(m_table_built == false);
- trans_ptr->checkIdents(m_states, m_events, m_actions);
- m_transitions.insertAtBottom(trans_ptr);
-}
-
-void StateMachine::addFunc(Func* func_ptr)
-{
- // register func in the symbol table
- g_sym_table.registerSym(func_ptr->toString(), func_ptr);
- m_internal_func_vec.insertAtBottom(func_ptr);
-}
-
-void StateMachine::buildTable()
-{
- assert(m_table_built == false);
- int numStates = m_states.size();
- int numEvents = m_events.size();
- int numTransitions = m_transitions.size();
- int stateIndex, eventIndex;
-
- for(stateIndex=0; stateIndex < numStates; stateIndex++) {
- m_table.insertAtBottom(Vector<Transition*>());
- for(eventIndex=0; eventIndex < numEvents; eventIndex++) {
- m_table[stateIndex].insertAtBottom(NULL);
- }
- }
-
- for(int i=0; i<numTransitions; i++) {
- Transition* trans_ptr = m_transitions[i];
-
- // Track which actions we touch so we know if we use them all --
- // really this should be done for all symbols as part of the
- // symbol table, then only trigger it for Actions, States, Events,
- // etc.
-
- Vector<Action*> actions = trans_ptr->getActions();
- for(int actionIndex=0; actionIndex < actions.size(); actionIndex++) {
- actions[actionIndex]->markUsed();
- }
-
- stateIndex = getStateIndex(trans_ptr->getStatePtr());
- eventIndex = getEventIndex(trans_ptr->getEventPtr());
- if (m_table[stateIndex][eventIndex] != NULL) {
- m_table[stateIndex][eventIndex]->warning("Duplicate transition: " + m_table[stateIndex][eventIndex]->toString());
- trans_ptr->error("Duplicate transition: " + trans_ptr->toString());
- }
- m_table[stateIndex][eventIndex] = trans_ptr;
- }
-
- // Look at all actions to make sure we used them all
- for(int actionIndex=0; actionIndex < m_actions.size(); actionIndex++) {
- Action* action_ptr = m_actions[actionIndex];
- if (!action_ptr->wasUsed()) {
- string error_msg = "Unused action: " + action_ptr->getIdent();
- if (action_ptr->existPair("desc")) {
- error_msg += ", " + action_ptr->getDescription();
- }
- action_ptr->warning(error_msg);
- }
- }
-
- m_table_built = true;
-}
-
-const Transition* StateMachine::getTransPtr(int stateIndex, int eventIndex) const
-{
- return m_table[stateIndex][eventIndex];
-}
-
-// *********************** //
-// ******* C Files ******* //
-// *********************** //
-
-void StateMachine::writeCFiles(string path)
-{
- string comp = getIdent();
- string filename;
-
- // Output the method declarations for the class declaration
- {
- ostringstream sstr;
- printControllerH(sstr, comp);
- conditionally_write_file(path + comp + "_Controller.hh", sstr);
- }
-
- // Output switch statement for transition table
- {
- ostringstream sstr;
- printCSwitch(sstr, comp);
- conditionally_write_file(path + comp + "_Transitions.cc", sstr);
- }
-
- // Output the actions for performing the actions
- {
- ostringstream sstr;
- printControllerC(sstr, comp);
- conditionally_write_file(path + comp + "_Controller.cc", sstr);
- }
-
- // Output the wakeup loop for the events
- {
- ostringstream sstr;
- printCWakeup(sstr, comp);
- conditionally_write_file(path + comp + "_Wakeup.cc", sstr);
- }
-
- // Profiling
- {
- ostringstream sstr;
- printProfilerC(sstr, comp);
- conditionally_write_file(path + comp + "_Profiler.cc", sstr);
- }
- {
- ostringstream sstr;
- printProfilerH(sstr, comp);
- conditionally_write_file(path + comp + "_Profiler.hh", sstr);
- }
-
- // Write internal func files
- for(int i=0; i<m_internal_func_vec.size(); i++) {
- m_internal_func_vec[i]->writeCFiles(path);
- }
-
-}
-
-void StateMachine::printControllerH(ostream& out, string component)
-{
-
- m_message_buffer_names.clear();
-
- out << "/** \\file " << getIdent() << ".hh" << endl;
- out << " * " << endl;
- out << " * Auto generated C++ code started by "<<__FILE__<<":"<<__LINE__<< endl;
- out << " * Created by slicc definition of Module \"" << getShorthand() << "\"" << endl;
- out << " */" << endl;
- out << endl;
- out << "#ifndef " << component << "_CONTROLLER_H" << endl;
- out << "#define " << component << "_CONTROLLER_H" << endl;
- out << endl;
- out << "#include \"mem/ruby/common/Global.hh\"" << endl;
- out << "#include \"mem/ruby/common/Consumer.hh\"" << endl;
- out << "#include \"mem/ruby/slicc_interface/AbstractController.hh\"" << endl;
- out << "#include \"mem/protocol/TransitionResult.hh\"" << endl;
- out << "#include \"mem/protocol/Types.hh\"" << endl;
- out << "#include \"mem/protocol/" << component << "_Profiler.hh\"" << endl;
-
- // include object classes
- std::set<string> seen_types;
- for(int i=0; i<numObjects(); i++) {
- Var* var = m_objs[i];
- if (seen_types.count(var->getType()->cIdent()) == 0) {
- out << "#include \"mem/protocol/" << var->getType()->cIdent() << ".hh\"" << endl;
- // out << "class " << var->getType()->cIdent() << ";" << endl;
- seen_types.insert(var->getType()->cIdent());
- }
- }
-
- out << endl;
-
- // for adding information to the protocol debug trace
- out << "extern stringstream " << component << "_" << "transitionComment;" << endl;
-
- out << "class " << component << "_Controller : public AbstractController {" << endl;
-
- /* the coherence checker needs to call isBlockExclusive() and isBlockShared()
- making the Chip a friend class is an easy way to do this for now */
- out << "#ifdef CHECK_COHERENCE" << endl;
- out << "#endif /* CHECK_COHERENCE */" << endl;
-
- out << "public:" << endl;
- // out << " " << component << "_Controller(int version, Network* net_ptr);" << endl;
- out << " " << component << "_Controller(const string & name);" << endl;
- out << " static int getNumControllers();" << endl;
- out << " void init(Network* net_ptr, const vector<string> & argv);" << endl;
- out << " MessageBuffer* getMandatoryQueue() const;" << endl;
- out << " const int & getVersion() const;" << endl;
- out << " const string toString() const;" << endl;
- out << " const string getName() const;" << endl;
- out << " const MachineType getMachineType() const;" << endl;
- out << " void print(ostream& out) const;" << endl;
- out << " void printConfig(ostream& out) const;" << endl;
- out << " void wakeup();" << endl;
- out << " void set_atomic(Address addr);" << endl;
- out << " void clear_atomic(Address addr);" << endl;
- out << " void reset_atomics();" << endl;
- out << " void printStats(ostream& out) const { s_profiler.dumpStats(out); }" << endl;
- out << " void clearStats() { s_profiler.clearStats(); }" << endl;
- out << "private:" << endl;
-//added by SS
-// found_to_mem = 0;
- for(int i=0;i<m_config_parameters->size();i++){
- out << " int m_" << m_config_parameters->ref(i)->getName() << ";" << endl;
- }
- if (strncmp(component.c_str(), "L1Cache", 7) == 0) {
- out << " int servicing_atomic;" << endl;
- out << " bool started_receiving_writes;" << endl;
- out << " Address locked_read_request1;" << endl;
- out << " Address locked_read_request2;" << endl;
- out << " Address locked_read_request3;" << endl;
- out << " Address locked_read_request4;" << endl;
- out << " int read_counter;" << endl;
- }
- out << " int m_number_of_TBEs;" << endl;
-
- out << " TransitionResult doTransition(" << component << "_Event event, " << component
- << "_State state, const Address& addr";
- if(CHECK_INVALID_RESOURCE_STALLS) {
- out << ", int priority";
- }
- out << "); // in " << component << "_Transitions.cc" << endl;
- out << " TransitionResult doTransitionWorker(" << component << "_Event event, " << component
- << "_State state, " << component << "_State& next_state, const Address& addr";
- if(CHECK_INVALID_RESOURCE_STALLS) {
- out << ", int priority";
- }
- out << "); // in " << component << "_Transitions.cc" << endl;
- out << " string m_name;" << endl;
- out << " int m_transitions_per_cycle;" << endl;
- out << " int m_buffer_size;" << endl;
- out << " int m_recycle_latency;" << endl;
- out << " map< string, string > m_cfg;" << endl;
- out << " NodeID m_version;" << endl;
- out << " Network* m_net_ptr;" << endl;
- out << " MachineID m_machineID;" << endl;
- out << " " << component << "_Profiler s_profiler;" << endl;
- out << " static int m_num_controllers;" << endl;
-
- // internal function protypes
- out << " // Internal functions" << endl;
- for(int i=0; i<m_internal_func_vec.size(); i++) {
- Func* func = m_internal_func_vec[i];
- string proto;
- func->funcPrototype(proto);
- if (proto != "") {
- out << " " << proto;
- }
- }
-
- out << " // Actions" << endl;
- for(int i=0; i < numActions(); i++) {
- const Action& action = getAction(i);
- out << "/** \\brief " << action.getDescription() << "*/" << endl;
- out << " void " << action.getIdent() << "(const Address& addr);" << endl;
- }
-
- // the controller internal variables
- out << " // Object" << endl;
- for(int i=0; i < numObjects(); i++) {
- const Var* var = m_objs[i];
- string template_hack = "";
- if (var->existPair("template_hack")) {
- template_hack = var->lookupPair("template_hack");
- }
- out << " " << var->getType()->cIdent() << template_hack << "* m_"
- << var->cIdent() << "_ptr;" << endl;
-
- string str = "m_"+ var->cIdent() + "_ptr";
- if (var->getType()->cIdent() == "MessageBuffer")
- m_message_buffer_names.push_back(str);
-
- }
-
-
- out << "};" << endl;
- out << "#endif // " << component << "_CONTROLLER_H" << endl;
-}
-
-void StateMachine::printControllerC(ostream& out, string component)
-{
- out << "/** \\file " << getIdent() << ".cc" << endl;
- out << " * " << endl;
- out << " * Auto generated C++ code started by "<<__FILE__<<":"<<__LINE__<< endl;
- out << " * Created by slicc definition of Module \"" << getShorthand() << "\"" << endl;
- out << " */" << endl;
- out << endl;
- out << "#include \"mem/ruby/common/Global.hh\"" << endl;
- out << "#include \"mem/ruby/slicc_interface/RubySlicc_includes.hh\"" << endl;
- out << "#include \"mem/protocol/" << component << "_Controller.hh\"" << endl;
- out << "#include \"mem/protocol/" << component << "_State.hh\"" << endl;
- out << "#include \"mem/protocol/" << component << "_Event.hh\"" << endl;
- out << "#include \"mem/protocol/Types.hh\"" << endl;
- out << "#include \"mem/ruby/system/System.hh\"" << endl;
-
- // include object classes
- std::set<string> seen_types;
- for(int i=0; i<numObjects(); i++) {
- Var* var = m_objs[i];
- if (seen_types.count(var->getType()->cIdent()) == 0) {
- out << "#include \"mem/protocol/" << var->getType()->cIdent() << ".hh\"" << endl;
- seen_types.insert(var->getType()->cIdent());
- }
-
- }
-
- out << endl;
-
- out << "int " << component << "_Controller::m_num_controllers = 0;" << endl;
-
- // for adding information to the protocol debug trace
- out << "stringstream " << component << "_" << "transitionComment;" << endl;
- out << "#define APPEND_TRANSITION_COMMENT(str) (" << component << "_" << "transitionComment << str)" << endl;
-
- out << "/** \\brief constructor */" << endl;
- out << component << "_Controller::" << component
- // << "_Controller(int version, Network* net_ptr)" << endl;
- << "_Controller(const string & name)" << endl;
- out << " : m_name(name)" << endl;
- out << "{ " << endl;
- if (strncmp(component.c_str(), "L1Cache", 7) == 0) {
- out << " servicing_atomic = 0;" << endl;
- out << " started_receiving_writes = false;" << endl;
- out << " locked_read_request1 = Address(-1);" << endl;
- out << " locked_read_request2 = Address(-1);" << endl;
- out << " locked_read_request3 = Address(-1);" << endl;
- out << " locked_read_request4 = Address(-1);" << endl;
- out << " read_counter = 0;" << endl;
- }
- out << " m_num_controllers++; " << endl;
- for(int i=0; i < numObjects(); i++) {
- const Var* var = m_objs[i];
- if ( var->cIdent().find("mandatoryQueue") != string::npos)
- out << " m_" << var->cIdent() << "_ptr = new " << var->getType()->cIdent() << "();" << endl;
- }
- out << "}" << endl << endl;
-
- out << "void " << component << "_Controller::init(Network * net_ptr, const vector<string> & argv)" << endl;
- out << "{" << endl;
- out << " for (size_t i=0; i < argv.size(); i+=2) {" << endl;
-// out << " printf (\"ARG: %s = %s \\n \", argv[i].c_str(), argv[i+1].c_str());"<< endl;
-
- out << " if (argv[i] == \"version\") " << endl;
- out << " m_version = atoi(argv[i+1].c_str());" << endl;
- out << " else if (argv[i] == \"transitions_per_cycle\") " << endl;
- out << " m_transitions_per_cycle = atoi(argv[i+1].c_str());" << endl;
- out << " else if (argv[i] == \"buffer_size\") " << endl;
- out << " m_buffer_size = atoi(argv[i+1].c_str());" << endl;
-//added by SS
- out << " else if (argv[i] == \"recycle_latency\") " << endl;
- out << " m_recycle_latency = atoi(argv[i+1].c_str());" << endl;
-//added by SS --> for latency
-//for loop on latency_vector to check with argv[i] and assign the value to the related m_latency ...
- out << " else if (argv[i] == \"number_of_TBEs\") " << endl;
- out << " m_number_of_TBEs = atoi(argv[i+1].c_str());" << endl;
-
- if (m_config_parameters->size()) {
- for(int i= 0 ; i < m_config_parameters->size(); i++) {
- out << " else if (argv[i] == \"" << m_config_parameters->ref(i)->getName() << "\")" << endl;
- if (m_config_parameters->ref(i)->getTypeName() == "int")
- out << " m_" << m_config_parameters->ref(i)->getName() << "=" << "atoi(argv[i+1].c_str());" << endl;
- else
- assert(0); // only int parameters are supported right now
- // if (str == "to_mem_ctrl_latency")
- // out << " m_" << (*it)->c_str() << "=" << "atoi(argv[i+1].c_str())+(random() % 5);" << endl;
- }
- }
- out << " }" << endl;
- out << " m_net_ptr = net_ptr;" << endl;
- out << " m_machineID.type = MachineType_" << component << ";" << endl;
- out << " m_machineID.num = m_version;" << endl;
-
- // make configuration array
- out << " for (size_t i=0; i < argv.size(); i+=2) {" << endl;
- out << " if (argv[i] != \"version\") " << endl;
- out << " m_cfg[argv[i]] = argv[i+1];" << endl;
- out << " }" << endl;
-
- out << endl;
-
- // initialize objects
- out << " // Objects" << endl;
- out << " s_profiler.setVersion(m_version);" << endl;
- for(int i=0; i < numObjects(); i++) {
- const Var* var = m_objs[i];
- if (!var->existPair("network")) {
- // Not a network port object
- if (var->getType()->existPair("primitive")) {
- out << " m_" << var->cIdent() << "_ptr = new " << var->getType()->cIdent() << ";\n";
- if (var->existPair("default")) {
- out << " (*m_" << var->cIdent() << "_ptr) = " << var->lookupPair("default") << ";\n";
- }
- out << " }\n";
-
- } else {
- // Normal Object
- string template_hack = "";
- if (var->existPair("template_hack")) {
- template_hack = var->lookupPair("template_hack");
- }
-//added by SS
- string str = "";
- int found = 0;
- if (var->existPair("factory")) {
- out << " m_" << var->cIdent() << "_ptr = " << var->lookupPair("factory");
- } else {
- if ( var->cIdent().find("mandatoryQueue") == string::npos) {
-
- str = " m_" + var->cIdent() + "_ptr = new " + var->getType()->cIdent() + template_hack;
- out << str;
- if (str.find("TBETable")!=string::npos){
- found = 1;
- }
-
- if (!var->getType()->existPair("non_obj") && (!var->getType()->isEnumeration())) {
- str = "";
- if (var->existPair("constructor_hack")) {
- string constructor_hack = var->lookupPair("constructor_hack");
- str = "(" + constructor_hack + ")";
- } else {
- str = "()";
- }
- if (found)
- str = "(m_number_of_TBEs)";
- out << str;
- }
- }
- }
-
- out << ";\n";
- out << " assert(m_" << var->cIdent() << "_ptr != NULL);" << endl;
-
- if (var->existPair("default")) {
- out << " (*m_" << var->cIdent() << "_ptr) = " << var->lookupPair("default")
- << "; // Object default" << endl;
- } else if (var->getType()->hasDefault()) {
- out << " (*m_" << var->cIdent() << "_ptr) = " << var->getType()->getDefault()
- << "; // Type " << var->getType()->getIdent() << " default" << endl;
- }
-
- // Set ordering
- if (var->existPair("ordered") && !var->existPair("trigger_queue")) {
- // A buffer
- string ordered = var->lookupPair("ordered");
- out << " m_" << var->cIdent() << "_ptr->setOrdering(" << ordered << ");\n";
- }
-
- // Set randomization
- if (var->existPair("random")) {
- // A buffer
- string value = var->lookupPair("random");
- out << " m_" << var->cIdent() << "_ptr->setRandomization(" << value << ");\n";
- }
-
- // Set Priority
- if (var->getType()->isBuffer() && var->existPair("rank") && !var->existPair("trigger_queue")) {
- string rank = var->lookupPair("rank");
- out << " m_" << var->cIdent() << "_ptr->setPriority(" << rank << ");\n";
- }
- }
- } else {
- // Network port object
- string network = var->lookupPair("network");
- string ordered = var->lookupPair("ordered");
- string vnet = var->lookupPair("virtual_network");
-
- assert (var->getMachine() != NULL);
- out << " m_" << var->cIdent() << "_ptr = m_net_ptr->get"
- << network << "NetQueue(m_version+MachineType_base_number(string_to_MachineType(\""
- << var->getMachine()->getIdent() << "\")), "
- << ordered << ", " << vnet << ");\n";
- out << " assert(m_" << var->cIdent() << "_ptr != NULL);" << endl;
-
- // Set ordering
- if (var->existPair("ordered")) {
- // A buffer
- string ordered = var->lookupPair("ordered");
- out << " m_" << var->cIdent() << "_ptr->setOrdering(" << ordered << ");\n";
- }
-
- // Set randomization
- if (var->existPair("random")) {
- // A buffer
- string value = var->lookupPair("random");
- out << " m_" << var->cIdent() << "_ptr->setRandomization(" << value << ");\n";
- }
-
- // Set Priority
- if (var->existPair("rank")) {
- string rank = var->lookupPair("rank");
- out << " m_" << var->cIdent() << "_ptr->setPriority(" << rank << ");\n";
- }
-
- // Set buffer size
- if (var->getType()->isBuffer()) {
- out << " if (m_buffer_size > 0) {\n";
- out << " m_" << var->cIdent() << "_ptr->setSize(m_buffer_size);\n";
- out << " }\n";
- }
-
- // set description (may be overriden later by port def)
- out << " m_" << var->cIdent()
- << "_ptr->setDescription(\"[Version \" + int_to_string(m_version) + \", "
- << component << ", name=" << var->cIdent() << "]\");" << endl;
- out << endl;
- }
- }
-
- // Set the queue consumers
- out << endl;
- for(int i=0; i < m_in_ports.size(); i++) {
- const Var* port = m_in_ports[i];
- out << " " << port->getCode() << ".setConsumer(this);" << endl;
- }
-
- // Set the queue descriptions
- out << endl;
- for(int i=0; i < m_in_ports.size(); i++) {
- const Var* port = m_in_ports[i];
- out << " " << port->getCode()
- << ".setDescription(\"[Version \" + int_to_string(m_version) + \", "
- << component << ", " << port->toString() << "]\");" << endl;
- }
-
- // Initialize the transition profiling
- out << endl;
- for(int i=0; i<numTransitions(); i++) {
- const Transition& t = getTransition(i);
- const Vector<Action*>& action_vec = t.getActions();
- int numActions = action_vec.size();
-
- // Figure out if we stall
- bool stall = false;
- for (int i=0; i<numActions; i++) {
- if(action_vec[i]->getIdent() == "z_stall") {
- stall = true;
- }
- }
-
- // Only possible if it is not a 'z' case
- if (!stall) {
- out << " s_profiler.possibleTransition(" << component << "_State_"
- << t.getStatePtr()->getIdent() << ", " << component << "_Event_"
- << t.getEventPtr()->getIdent() << ");" << endl;
- }
- }
-
- //added by SS to initialize recycle_latency of message buffers
- std::vector<std::string>::const_iterator it;
- for ( it=m_message_buffer_names.begin() ; it != m_message_buffer_names.end(); it++ ){
- out << " "<< (*it).c_str() << "->setRecycleLatency(m_recycle_latency);" << endl;
- }
-
-
- out << "}" << endl;
-
- out << endl;
-
- bool has_mandatory_q = false;
- for(int i=0; i < m_in_ports.size(); i++) {
- if (m_in_ports[i]->getCode().find("mandatoryQueue_ptr")!= string::npos)
- has_mandatory_q = true;
- }
-
- out << "int " << component << "_Controller::getNumControllers() {" << endl;
- out << " return m_num_controllers;" << endl;
- out << "}" << endl;
-
- out << endl;
-
- out << "MessageBuffer* " << component << "_Controller::getMandatoryQueue() const {" << endl;
- if (has_mandatory_q)
- out << " return m_" << component << "_mandatoryQueue_ptr;" << endl;
- else
- out << " return NULL;" << endl;
- out << "}" << endl;
-
- out << endl;
-
- out << "const int & "<<component<<"_Controller::getVersion() const{" << endl;
- out << " return m_version;" << endl;
- out << "}";
-
- out << endl;
-
- out << "const string "<<component<<"_Controller::toString() const{" << endl;
- out << " return \"" << component<< "_Controller\";" << endl;
- out << "}";
-
- out << endl;
-
- out << "const string "<<component<<"_Controller::getName() const{" << endl;
- out << " return m_name;" << endl;
- out << "}";
-
- out << endl;
-
- out << "const MachineType "<<component<<"_Controller::getMachineType() const{" << endl;
- out << " return MachineType_" << component<< ";" << endl;
- out << "}";
-
- out << endl;
-
- out << "void " << component << "_Controller::print(ostream& out) const { out << \"[" << component
- << "_Controller \" << m_version << \"]\"; }" << endl;
-
- out << "void " << component << "_Controller::printConfig(ostream& out) const {" << endl;
- out << " out << \"" << component << "_Controller config: \" << m_name << endl;" << endl;
- out << " out << \" version: \" << m_version << endl;" << endl;
- out << " for(map< string, string >::const_iterator it = m_cfg.begin(); it != m_cfg.end(); it++) {" << endl;
- out << " out << \" \" << (*it).first << \": \" << (*it).second << endl;" << endl;
- out << " }" << endl;
- out << "}" << endl;
-
- out << endl;
- out << "// Actions" << endl;
- out << endl;
-
- for(int i=0; i < numActions(); i++) {
- const Action& action = getAction(i);
- if (action.existPair("c_code")) {
- out << "/** \\brief " << action.getDescription() << "*/" << endl;
- out << "void " << component << "_Controller::"
- << action.getIdent() << "(const Address& addr)" << endl;
- out << "{" << endl;
- out << " DEBUG_MSG(GENERATED_COMP, HighPrio,\"executing\");" << endl;
-//added by SS
-//it should point to m_latency...
-//so I should change the string output of this lookup
-
-
- string c_code_string = action.lookupPair("c_code");
-
- out << c_code_string;
-
- out << "}" << endl;
- }
- out << endl;
- }
-}
-
-void StateMachine::printCWakeup(ostream& out, string component)
-{
- out << "// Auto generated C++ code started by "<<__FILE__<<":"<<__LINE__<< endl;
- out << "// " << getIdent() << ": " << getShorthand() << endl;
- out << endl;
- out << "#include \"mem/ruby/common/Global.hh\"" << endl;
- out << "#include \"mem/ruby/slicc_interface/RubySlicc_includes.hh\"" << endl;
- out << "#include \"mem/protocol/" << component << "_Controller.hh\"" << endl;
- out << "#include \"mem/protocol/" << component << "_State.hh\"" << endl;
- out << "#include \"mem/protocol/" << component << "_Event.hh\"" << endl;
- out << "#include \"mem/protocol/Types.hh\"" << endl;
- out << "#include \"mem/ruby/system/System.hh\"" << endl;
- out << endl;
- out << "void " << component << "_Controller::wakeup()" << endl;
- out << "{" << endl;
- // out << " DEBUG_EXPR(GENERATED_COMP, MedPrio,*this);" << endl;
- // out << " DEBUG_EXPR(GENERATED_COMP, MedPrio,g_eventQueue_ptr->getTime());" << endl;
- out << endl;
- out << "int counter = 0;" << endl;
- out << " while (true) {" << endl;
- out << " // Some cases will put us into an infinite loop without this limit" << endl;
- out << " assert(counter <= m_transitions_per_cycle);" << endl;
- out << " if (counter == m_transitions_per_cycle) {" << endl;
- out << " g_system_ptr->getProfiler()->controllerBusy(m_machineID); // Count how often we're fully utilized" << endl;
- out << " g_eventQueue_ptr->scheduleEvent(this, 1); // Wakeup in another cycle and try again" << endl;
- out << " break;" << endl;
- out << " }" << endl;
-
- // InPorts
- //
- // Find the position of the mandatory queue in the vector so that we can print it out first
- int j = -1;
- if (strncmp(component.c_str(), "L1Cache", 7) == 0) {
- for(int i=0; i < m_in_ports.size(); i++) {
- const Var* port = m_in_ports[i];
- assert(port->existPair("c_code_in_port"));
- if (port->toString().find("mandatoryQueue_in") != string::npos) {
- assert (j == -1);
- j = i;
- }
- else {
- cout << port->toString() << endl << flush;
- }
- }
-
- assert(j != -1);
-
- // print out the mandatory queue here
- const Var* port = m_in_ports[j];
- assert(port->existPair("c_code_in_port"));
- out << " // "
- << component << "InPort " << port->toString()
- << endl;
- string output = port->lookupPair("c_code_in_port");
-
- out << output;
- out << endl;
- }
- for(int i=0; i < m_in_ports.size(); i++) {
- const Var* port = m_in_ports[i];
- // don't print out mandatory queue twice
- if (i != j) {
- if (strncmp(component.c_str(), "L1Cache", 7) == 0) {
- if (port->toString().find("forwardRequestNetwork_in") != string::npos) {
- out << " bool postpone = false;" << endl;
- out << " if ((((*m_L1Cache_forwardToCache_ptr)).isReady())) {" << endl;
- out << " const RequestMsg* in_msg_ptr;" << endl;
- out << " in_msg_ptr = dynamic_cast<const RequestMsg*>(((*m_L1Cache_forwardToCache_ptr)).peek());" << endl;
- out << " if ((((servicing_atomic > 0) && (locked_read_request1 == ((*in_msg_ptr)).m_Address || locked_read_request2 == ((*in_msg_ptr)).m_Address || locked_read_request3 == ((*in_msg_ptr)).m_Address || locked_read_request1 == ((*in_msg_ptr)).m_Address)))) {" << endl;
- out << " postpone = true;" << endl;
- out << " }" << endl;
-
- out << " }" << endl;
- out << " if (!postpone) {" << endl;
- }
- else if (port->toString().find("requestNetwork_in") != string::npos || port->toString().find("requestIntraChipL1Network_in") != string::npos) {
- out << " bool postpone = false;" << endl;
- out << " if ((((*m_L1Cache_requestToL1Cache_ptr)).isReady())) {" << endl;
- out << " const RequestMsg* in_msg_ptr;" << endl;
- out << " in_msg_ptr = dynamic_cast<const RequestMsg*>(((*m_L1Cache_requestToL1Cache_ptr)).peek());" << endl;
- out << " if ((((servicing_atomic > 0) && (locked_read_request1 == ((*in_msg_ptr)).m_Address || locked_read_request2 == ((*in_msg_ptr)).m_Address || locked_read_request3 == ((*in_msg_ptr)).m_Address || locked_read_request1 == ((*in_msg_ptr)).m_Address)))) {" << endl;
- out << " postpone = true;" << endl;
- out << " }" << endl;
-
- out << " }" << endl;
- out << " if (!postpone) {" << endl;
- }
- }
- assert(port->existPair("c_code_in_port"));
- out << " // "
- << component << "InPort " << port->toString()
- << endl;
- out << port->lookupPair("c_code_in_port");
- if (strncmp(component.c_str(), "L1Cache", 7) == 0) {
- if (port->toString().find("forwardRequestNetwork_in") != string::npos) {
- out << "}" << endl;
- }
- else if (port->toString().find("requestIntraChipL1Network_in") != string::npos) {
- out << "}" << endl;
- }
- else if (port->toString().find("requestNetwork_in") != string::npos) {
- out << "}" << endl;
- }
- }
- out << endl;
- }
- }
-
- out << " break; // If we got this far, we have nothing left todo" << endl;
- out << " }" << endl;
- // out << " g_eventQueue_ptr->scheduleEvent(this, 1);" << endl;
- // out << " DEBUG_NEWLINE(GENERATED_COMP, MedPrio);" << endl;
- out << "}" << endl;
- out << endl;
-
-
- // tack on two more functions
- if (strncmp(component.c_str(), "L1Cache", 7) == 0) {
- out << "void " << component << "_Controller::set_atomic(Address addr)" << endl;
- out << "{" << endl;
- out << " servicing_atomic++; " << endl;
- out << " switch (servicing_atomic) { " << endl;
- out << " case(1): " << endl;
- out << " assert(locked_read_request1 == Address(-1)); " << endl;
- out << " locked_read_request1 = addr; " << endl;
- out << " break; " << endl;
- out << " case(2): " << endl;
- out << " assert(locked_read_request2 == Address(-1)); " << endl;
- out << " locked_read_request2 = addr; " << endl;
- out << " break; " << endl;
- out << " case(3): " << endl;
- out << " assert(locked_read_request3 == Address(-1)); " << endl;
- out << " locked_read_request3 = addr; " << endl;
- out << " break; " << endl;
- out << " case(4): " << endl;
- out << " assert(locked_read_request4 == Address(-1)); " << endl;
- out << " locked_read_request4 = addr; " << endl;
- out << " break; " << endl;
- out << " default: " << endl;
- out << " assert(0);" << endl;
- out << " }" << endl;
- out << "}" << endl;
-
- out << "void " << component << "_Controller::clear_atomic(Address addr)" << endl;
- out << "{" << endl;
- out << " assert(servicing_atomic > 0); " << endl;
- out << " if (addr == locked_read_request1) " << endl;
- out << " locked_read_request1 = Address(-1);" << endl;
- out << " else if (addr == locked_read_request2)" << endl;
- out << " locked_read_request2 = Address(-1);" << endl;
- out << " else if (addr == locked_read_request3)" << endl;
- out << " locked_read_request3 = Address(-1);" << endl;
- out << " else if (addr == locked_read_request4)" << endl;
- out << " locked_read_request4 = Address(-1);" << endl;
- out << " else " << endl;
- out << " assert(0); " << endl;
- out << " servicing_atomic--; " << endl;
- out << "}" << endl;
-
- out << "void " << component << "_Controller::reset_atomics()" << endl;
- out << "{" << endl;
- out << " servicing_atomic = 0; " << endl;
- out << " locked_read_request1 = Address(-1);" << endl;
- out << " locked_read_request2 = Address(-1);" << endl;
- out << " locked_read_request3 = Address(-1);" << endl;
- out << " locked_read_request4 = Address(-1);" << endl;
- out << "}" << endl;
- }
- else {
- out << "void " << component << "_Controller::set_atomic(Address addr)" << endl;
- out << "{" << endl;
- out << " assert(0); " << endl;
- out << "}" << endl;
-
- out << "void " << component << "_Controller::clear_atomic(Address addr)" << endl;
- out << "{" << endl;
- out << " assert(0); " << endl;
- out << "}" << endl;
-
- out << "void " << component << "_Controller::reset_atomics()" << endl;
- out << "{" << endl;
- out << " assert(0); " << endl;
- out << "}" << endl;
- }
-
-}
-
-void StateMachine::printCSwitch(ostream& out, string component)
-{
- out << "// Auto generated C++ code started by "<<__FILE__<<":"<<__LINE__<< endl;
- out << "// " << getIdent() << ": " << getShorthand() << endl;
- out << endl;
- out << "#include \"mem/ruby/common/Global.hh\"" << endl;
- out << "#include \"mem/protocol/" << component << "_Controller.hh\"" << endl;
- out << "#include \"mem/protocol/" << component << "_State.hh\"" << endl;
- out << "#include \"mem/protocol/" << component << "_Event.hh\"" << endl;
- out << "#include \"mem/protocol/Types.hh\"" << endl;
- out << "#include \"mem/ruby/system/System.hh\"" << endl;
- out << endl;
- out << "#define HASH_FUN(state, event) ((int(state)*" << component
- << "_Event_NUM)+int(event))" << endl;
- out << endl;
- out << "#define GET_TRANSITION_COMMENT() (" << component << "_" << "transitionComment.str())" << endl;
- out << "#define CLEAR_TRANSITION_COMMENT() (" << component << "_" << "transitionComment.str(\"\"))" << endl;
- out << endl;
- out << "TransitionResult " << component << "_Controller::doTransition("
- << component << "_Event event, "
- << component << "_State state, "
- << "const Address& addr" << endl;
- if(CHECK_INVALID_RESOURCE_STALLS) {
- out << ", int priority";
- }
- out << ")" << endl;
-
- out << "{" << endl;
- out << " " << component << "_State next_state = state;" << endl;
- out << endl;
- out << " DEBUG_NEWLINE(GENERATED_COMP, MedPrio);" << endl;
- out << " DEBUG_MSG(GENERATED_COMP, MedPrio,*this);" << endl;
- out << " DEBUG_EXPR(GENERATED_COMP, MedPrio,g_eventQueue_ptr->getTime());" << endl;
- out << " DEBUG_EXPR(GENERATED_COMP, MedPrio,state);" << endl;
- out << " DEBUG_EXPR(GENERATED_COMP, MedPrio,event);" << endl;
- out << " DEBUG_EXPR(GENERATED_COMP, MedPrio,addr);" << endl;
- out << endl;
- out << " TransitionResult result = doTransitionWorker(event, state, next_state, addr";
- if(CHECK_INVALID_RESOURCE_STALLS) {
- out << ", priority";
- }
- out << ");" << endl;
- out << endl;
- out << " if (result == TransitionResult_Valid) {" << endl;
- out << " DEBUG_EXPR(GENERATED_COMP, MedPrio, next_state);" << endl;
- out << " DEBUG_NEWLINE(GENERATED_COMP, MedPrio);" << endl;
- out << " s_profiler.countTransition(state, event);" << endl;
- out << " if (Debug::getProtocolTrace()) {" << endl
- << " g_system_ptr->getProfiler()->profileTransition(\"" << component
- << "\", m_version, addr, " << endl
- << " " << component << "_State_to_string(state), " << endl
- << " " << component << "_Event_to_string(event), " << endl
- << " " << component << "_State_to_string(next_state), GET_TRANSITION_COMMENT());" << endl
- << " }" << endl;
- out << " CLEAR_TRANSITION_COMMENT();" << endl;
- out << " " << component << "_setState(addr, next_state);" << endl;
- out << " " << endl;
- out << " } else if (result == TransitionResult_ResourceStall) {" << endl;
- out << " if (Debug::getProtocolTrace()) {" << endl
- << " g_system_ptr->getProfiler()->profileTransition(\"" << component
- << "\", m_version, addr, " << endl
- << " " << component << "_State_to_string(state), " << endl
- << " " << component << "_Event_to_string(event), " << endl
- << " " << component << "_State_to_string(next_state), " << endl
- << " \"Resource Stall\");" << endl
- << " }" << endl;
- out << " } else if (result == TransitionResult_ProtocolStall) {" << endl;
- out << " DEBUG_MSG(GENERATED_COMP,HighPrio,\"stalling\");" << endl
- << " DEBUG_NEWLINE(GENERATED_COMP, MedPrio);" << endl;
- out << " if (Debug::getProtocolTrace()) {" << endl
- << " g_system_ptr->getProfiler()->profileTransition(\"" << component
- << "\", m_version, addr, " << endl
- << " " << component << "_State_to_string(state), " << endl
- << " " << component << "_Event_to_string(event), " << endl
- << " " << component << "_State_to_string(next_state), " << endl
- << " \"Protocol Stall\");" << endl
- << " }" << endl
- << " }" << endl;
- out << " return result;" << endl;
- out << "}" << endl;
- out << endl;
- out << "TransitionResult " << component << "_Controller::doTransitionWorker("
- << component << "_Event event, "
- << component << "_State state, "
- << component << "_State& next_state, "
- << "const Address& addr" << endl;
- if(CHECK_INVALID_RESOURCE_STALLS) {
- out << ", int priority" << endl;
- }
- out << ")" << endl;
-
- out << "{" << endl;
- out << "" << endl;
-
- out << " switch(HASH_FUN(state, event)) {" << endl;
-
- Map<string, Vector<string> > code_map; // This map will allow suppress generating duplicate code
- Vector<string> code_vec;
-
- for(int i=0; i<numTransitions(); i++) {
- const Transition& t = getTransition(i);
- string case_string = component + "_State_" + t.getStatePtr()->getIdent()
- + ", " + component + "_Event_" + t.getEventPtr()->getIdent();
-
- string code;
-
- code += " {\n";
- // Only set next_state if it changes
- if (t.getStatePtr() != t.getNextStatePtr()) {
- code += " next_state = " + component + "_State_" + t.getNextStatePtr()->getIdent() + ";\n";
- }
-
- const Vector<Action*>& action_vec = t.getActions();
- int numActions = action_vec.size();
-
- // Check for resources
- Vector<string> code_sorter;
- const Map<Var*, string>& res = t.getResources();
- Vector<Var*> res_keys = res.keys();
- for (int i=0; i<res_keys.size(); i++) {
- string temp_code;
- if (res_keys[i]->getType()->cIdent() == "DNUCAStopTable") {
- temp_code += res.lookup(res_keys[i]);
- } else {
- temp_code += " if (!" + (res_keys[i]->getCode()) + ".areNSlotsAvailable(" + res.lookup(res_keys[i]) + ")) {\n";
- if(CHECK_INVALID_RESOURCE_STALLS) {
- // assert that the resource stall is for a resource of equal or greater priority
- temp_code += " assert(priority >= "+ (res_keys[i]->getCode()) + ".getPriority());\n";
- }
- temp_code += " return TransitionResult_ResourceStall;\n";
- temp_code += " }\n";
- }
- code_sorter.insertAtBottom(temp_code);
- }
-
- // Emit the code sequences in a sorted order. This makes the
- // output deterministic (without this the output order can vary
- // since Map's keys() on a vector of pointers is not deterministic
- code_sorter.sortVector();
- for (int i=0; i<code_sorter.size(); i++) {
- code += code_sorter[i];
- }
-
- // Figure out if we stall
- bool stall = false;
- for (int i=0; i<numActions; i++) {
- if(action_vec[i]->getIdent() == "z_stall") {
- stall = true;
- }
- }
-
- if (stall) {
- code += " return TransitionResult_ProtocolStall;\n";
- } else {
- for (int i=0; i<numActions; i++) {
- code += " " + action_vec[i]->getIdent() + "(addr);\n";
- }
- code += " return TransitionResult_Valid;\n";
- }
- code += " }\n";
-
-
- // Look to see if this transition code is unique.
- if (code_map.exist(code)) {
- code_map.lookup(code).insertAtBottom(case_string);
- } else {
- Vector<string> vec;
- vec.insertAtBottom(case_string);
- code_map.add(code, vec);
- code_vec.insertAtBottom(code);
- }
- }
-
- // Walk through all of the unique code blocks and spit out the
- // corresponding case statement elements
- for (int i=0; i<code_vec.size(); i++) {
- string code = code_vec[i];
-
- // Iterative over all the multiple transitions that share the same code
- for (int case_num=0; case_num<code_map.lookup(code).size(); case_num++) {
- string case_string = code_map.lookup(code)[case_num];
- out << " case HASH_FUN(" << case_string << "):" << endl;
- }
- out << code;
- }
-
- out << " default:" << endl;
- out << " WARN_EXPR(m_version);" << endl;
- out << " WARN_EXPR(g_eventQueue_ptr->getTime());" << endl;
- out << " WARN_EXPR(addr);" << endl;
- out << " WARN_EXPR(event);" << endl;
- out << " WARN_EXPR(state);" << endl;
- out << " ERROR_MSG(\"Invalid transition\");" << endl;
- out << " }" << endl;
- out << " return TransitionResult_Valid;" << endl;
- out << "}" << endl;
-}
-
-void StateMachine::printProfilerH(ostream& out, string component)
-{
- out << "// Auto generated C++ code started by "<<__FILE__<<":"<<__LINE__<< endl;
- out << "// " << getIdent() << ": " << getShorthand() << endl;
- out << endl;
- out << "#ifndef " << component << "_PROFILER_H" << endl;
- out << "#define " << component << "_PROFILER_H" << endl;
- out << endl;
- out << "#include \"mem/ruby/common/Global.hh\"" << endl;
- out << "#include \"mem/protocol/" << component << "_State.hh\"" << endl;
- out << "#include \"mem/protocol/" << component << "_Event.hh\"" << endl;
- out << endl;
- out << "class " << component << "_Profiler {" << endl;
- out << "public:" << endl;
- out << " " << component << "_Profiler();" << endl;
- out << " void setVersion(int version);" << endl;
- out << " void countTransition(" << component << "_State state, " << component << "_Event event);" << endl;
- out << " void possibleTransition(" << component << "_State state, " << component << "_Event event);" << endl;
- out << " void dumpStats(ostream& out) const;" << endl;
- out << " void clearStats();" << endl;
- out << "private:" << endl;
- out << " int m_counters[" << component << "_State_NUM][" << component << "_Event_NUM];" << endl;
- out << " int m_event_counters[" << component << "_Event_NUM];" << endl;
- out << " bool m_possible[" << component << "_State_NUM][" << component << "_Event_NUM];" << endl;
- out << " int m_version;" << endl;
- out << "};" << endl;
- out << "#endif // " << component << "_PROFILER_H" << endl;
-}
-
-void StateMachine::printProfilerC(ostream& out, string component)
-{
- out << "// Auto generated C++ code started by "<<__FILE__<<":"<<__LINE__<< endl;
- out << "// " << getIdent() << ": " << getShorthand() << endl;
- out << endl;
- out << "#include \"mem/protocol/" << component << "_Profiler.hh\"" << endl;
- out << endl;
-
- // Constructor
- out << component << "_Profiler::" << component << "_Profiler()" << endl;
- out << "{" << endl;
- out << " for (int state = 0; state < " << component << "_State_NUM; state++) {" << endl;
- out << " for (int event = 0; event < " << component << "_Event_NUM; event++) {" << endl;
- out << " m_possible[state][event] = false;" << endl;
- out << " m_counters[state][event] = 0;" << endl;
- out << " }" << endl;
- out << " }" << endl;
- out << " for (int event = 0; event < " << component << "_Event_NUM; event++) {" << endl;
- out << " m_event_counters[event] = 0;" << endl;
- out << " }" << endl;
- out << "}" << endl;
-
- // setVersion
- out << "void " << component << "_Profiler::setVersion(int version)" << endl;
- out << "{" << endl;
- out << " m_version = version;" << endl;
- out << "}" << endl;
-
- // Clearstats
- out << "void " << component << "_Profiler::clearStats()" << endl;
- out << "{" << endl;
- out << " for (int state = 0; state < " << component << "_State_NUM; state++) {" << endl;
- out << " for (int event = 0; event < " << component << "_Event_NUM; event++) {" << endl;
- out << " m_counters[state][event] = 0;" << endl;
- out << " }" << endl;
- out << " }" << endl;
- out << " for (int event = 0; event < " << component << "_Event_NUM; event++) {" << endl;
- out << " m_event_counters[event] = 0;" << endl;
- out << " }" << endl;
- out << "}" << endl;
-
- // Count Transition
- out << "void " << component << "_Profiler::countTransition(" << component << "_State state, " << component << "_Event event)" << endl;
- out << "{" << endl;
- out << " assert(m_possible[state][event]);" << endl;
- out << " m_counters[state][event]++;" << endl;
- out << " m_event_counters[event]++;" << endl;
- out << "}" << endl;
-
- // Possible Transition
- out << "void " << component << "_Profiler::possibleTransition(" << component << "_State state, " << component << "_Event event)" << endl;
- out << "{" << endl;
- out << " m_possible[state][event] = true;" << endl;
- out << "}" << endl;
-
- // dumpStats
- out << "void " << component << "_Profiler::dumpStats(ostream& out) const" << endl;
- out << "{" << endl;
- out << " out << \" --- " << component << " \" << m_version << \" ---\" << endl;" << endl;
- out << " out << \" - Event Counts -\" << endl;" << endl;
- out << " for (int event = 0; event < " << component << "_Event_NUM; event++) {" << endl;
- out << " int count = m_event_counters[event];" << endl;
- out << " out << (" << component << "_Event) event << \" \" << count << endl;" << endl;
- out << " }" << endl;
- out << " out << endl;" << endl;
- out << " out << \" - Transitions -\" << endl;" << endl;
- out << " for (int state = 0; state < " << component << "_State_NUM; state++) {" << endl;
- out << " for (int event = 0; event < " << component << "_Event_NUM; event++) {" << endl;
- out << " if (m_possible[state][event]) {" << endl;
- out << " int count = m_counters[state][event];" << endl;
- out << " out << (" << component << "_State) state << \" \" << (" << component << "_Event) event << \" \" << count;" << endl;
- out << " if (count == 0) {" << endl;
- out << " out << \" <-- \";" << endl;
- out << " }" << endl;
- out << " out << endl;" << endl;
- out << " }" << endl;
- out << " }" << endl;
- out << " out << endl;" << endl;
- out << " }" << endl;
- out << "}" << endl;
-}
-
-
-
-// ************************** //
-// ******* HTML Files ******* //
-// ************************** //
-
-string frameRef(string click_href, string click_target, string over_href, string over_target_num, string text)
-{
- string temp;
- temp += "<A href=\"" + click_href + "\" ";
- temp += "target=\"" + click_target + "\" ";
- string javascript = "if (parent.frames[" + over_target_num + "].location != parent.location + '" + over_href + "') { parent.frames[" + over_target_num + "].location='" + over_href + "' }";
- // string javascript = "parent." + target + ".location='" + href + "'";
- temp += "onMouseOver=\"" + javascript + "\" ";
- temp += ">" + text + "</A>";
- return temp;
-}
-
-string frameRef(string href, string target, string target_num, string text)
-{
- return frameRef(href, target, href, target_num, text);
-}
-
-
-void StateMachine::writeHTMLFiles(string path)
-{
- string filename;
- string component = getIdent();
-
- /*
- {
- ostringstream out;
- out << "<html>" << endl;
- out << "<head>" << endl;
- out << "<title>" << component << "</title>" << endl;
- out << "</head>" << endl;
- out << "<frameset rows=\"30,30,*\" frameborder=\"1\">" << endl;
- out << " <frame name=\"Status\" src=\"empty.html\" marginheight=\"1\">" << endl;
- out << " <frame name=\"Table\" src=\"" << component << "_table.html\" marginheight=\"1\">" << endl;
- out << "</frameset>" << endl;
- out << "</html>" << endl;
- conditionally_write_file(path + component + ".html", out);
- }
- */
-
- // Create table with no row hilighted
- {
- ostringstream out;
- printHTMLTransitions(out, numStates()+1);
-
- // -- Write file
- filename = component + "_table.html";
- conditionally_write_file(path + filename, out);
- }
-
- // Generate transition tables
- for(int i=0; i<numStates(); i++) {
- ostringstream out;
- printHTMLTransitions(out, i);
-
- // -- Write file
- filename = component + "_table_" + getState(i).getIdent() + ".html";
- conditionally_write_file(path + filename, out);
- }
-
- // Generate action descriptions
- for(int i=0; i<numActions(); i++) {
- ostringstream out;
- createHTMLSymbol(getAction(i), "Action", out);
-
- // -- Write file
- filename = component + "_action_" + getAction(i).getIdent() + ".html";
- conditionally_write_file(path + filename, out);
- }
-
- // Generate state descriptions
- for(int i=0; i<numStates(); i++) {
- ostringstream out;
- createHTMLSymbol(getState(i), "State", out);
-
- // -- Write file
- filename = component + "_State_" + getState(i).getIdent() + ".html";
- conditionally_write_file(path + filename, out);
- }
-
- // Generate event descriptions
- for(int i=0; i<numEvents(); i++) {
- ostringstream out;
- createHTMLSymbol(getEvent(i), "Event", out);
-
- // -- Write file
- filename = component + "_Event_" + getEvent(i).getIdent() + ".html";
- conditionally_write_file(path + filename, out);
- }
-}
-
-void StateMachine::printHTMLTransitions(ostream& out, int active_state)
-{
- // -- Prolog
- out << "<HTML><BODY link=\"blue\" vlink=\"blue\">" << endl;
-
- // -- Header
- out << "<H1 align=\"center\">" << formatHTMLShorthand(getShorthand()) << ": " << endl;
- Vector<StateMachine*> machine_vec = g_sym_table.getStateMachines();
- for (int i=0; i<machine_vec.size(); i++) {
- StateMachine* type = machine_vec[i];
- if (i != 0) {
- out << " - ";
- }
- if (type == this) {
- out << type->getIdent() << endl;
- } else {
- out << "<A target=\"Table\"href=\"" + type->getIdent() + "_table.html\">" + type->getIdent() + "</A> " << endl;
- }
- }
- out << "</H1>" << endl;
-
- // -- Table header
- out << "<TABLE border=1>" << endl;
-
- // -- Column headers
- out << "<TR>" << endl;
-
- // -- First column header
- out << " <TH> </TH>" << endl;
-
- for(int event = 0; event < numEvents(); event++ ) {
- out << " <TH bgcolor=white>";
- out << frameRef(getIdent() + "_Event_" + getEvent(event).getIdent() + ".html", "Status", "1", formatHTMLShorthand(getEvent(event).getShorthand()));
- out << "</TH>" << endl;
- }
-
- out << "</TR>" << endl;
-
- // -- Body of table
- for(int state = 0; state < numStates(); state++ ) {
- out << "<TR>" << endl;
-
- // -- Each row
- if (state == active_state) {
- out << " <TH bgcolor=yellow>";
- } else {
- out << " <TH bgcolor=white>";
- }
-
- string click_href = getIdent() + "_table_" + getState(state).getIdent() + ".html";
- string text = formatHTMLShorthand(getState(state).getShorthand());
-
- out << frameRef(click_href, "Table", getIdent() + "_State_" + getState(state).getIdent() + ".html", "1", formatHTMLShorthand(getState(state).getShorthand()));
- out << "</TH>" << endl;
-
- // -- One column for each event
- for(int event = 0; event < numEvents(); event++ ) {
- const Transition* trans_ptr = getTransPtr(state, event);
-
- if( trans_ptr != NULL ) {
- bool stall_action = false;
- string nextState;
- string actions_str;
-
- // -- Get the actions
- // actions = trans_ptr->getActionShorthands();
- const Vector<Action*> actions = trans_ptr->getActions();
- for (int action=0; action < actions.size(); action++) {
- if ((actions[action]->getIdent() == "z_stall") ||
- (actions[action]->getIdent() == "zz_recycleMandatoryQueue")) {
- stall_action = true;
- }
- actions_str += " ";
- actions_str += frameRef(getIdent() + "_action_" + actions[action]->getIdent() + ".html", "Status", "1",
- formatHTMLShorthand(actions[action]->getShorthand()));
- actions_str += "\n";
- }
-
- // -- Get the next state
- if (trans_ptr->getNextStatePtr()->getIdent() != getState(state).getIdent()) {
- string click_href = getIdent() + "_table_" + trans_ptr->getNextStatePtr()->getIdent() + ".html";
- nextState = frameRef(click_href, "Table", getIdent() + "_State_" + trans_ptr->getNextStatePtr()->getIdent() + ".html", "1",
- formatHTMLShorthand(trans_ptr->getNextStateShorthand()));
- } else {
- nextState = "";
- }
-
- // -- Print out "actions/next-state"
- if (stall_action) {
- if (state == active_state) {
- out << " <TD bgcolor=#C0C000>";
- } else {
- out << " <TD bgcolor=lightgrey>";
- }
- } else if (active_state < numStates() && (trans_ptr->getNextStatePtr()->getIdent() == getState(active_state).getIdent())) {
- out << " <TD bgcolor=aqua>";
- } else if (state == active_state) {
- out << " <TD bgcolor=yellow>";
- } else {
- out << " <TD bgcolor=white>";
- }
-
- out << actions_str;
- if ((nextState.length() != 0) && (actions_str.length() != 0)) {
- out << "/";
- }
- out << nextState;
- out << "</TD>" << endl;
- } else {
- // This is the no transition case
- if (state == active_state) {
- out << " <TD bgcolor=#C0C000>&nbsp;</TD>" << endl;
- } else {
- out << " <TD bgcolor=lightgrey>&nbsp;</TD>" << endl;
- }
- }
- }
- // -- Each row
- if (state == active_state) {
- out << " <TH bgcolor=yellow>";
- } else {
- out << " <TH bgcolor=white>";
- }
-
- click_href = getIdent() + "_table_" + getState(state).getIdent() + ".html";
- text = formatHTMLShorthand(getState(state).getShorthand());
-
- out << frameRef(click_href, "Table", getIdent() + "_State_" + getState(state).getIdent() + ".html", "1", formatHTMLShorthand(getState(state).getShorthand()));
- out << "</TH>" << endl;
-
- out << "</TR>" << endl;
- }
-
- // -- Column footer
- out << "<TR>" << endl;
- out << " <TH> </TH>" << endl;
-
- for(int i = 0; i < numEvents(); i++ ) {
- out << " <TH bgcolor=white>";
- out << frameRef(getIdent() + "_Event_" + getEvent(i).getIdent() + ".html", "Status", "1", formatHTMLShorthand(getEvent(i).getShorthand()));
- out << "</TH>" << endl;
- }
- out << "</TR>" << endl;
-
- // -- Epilog
- out << "</TABLE>" << endl;
- out << "</BODY></HTML>" << endl;
-}
-
-