summaryrefslogtreecommitdiff
path: root/src/mem/slicc
diff options
context:
space:
mode:
authorDerek Hower <drh5@cs.wisc.edu>2010-01-22 17:23:21 -0600
committerDerek Hower <drh5@cs.wisc.edu>2010-01-22 17:23:21 -0600
commit589218168c5ae1ed143372e43dbc468369a1bb8f (patch)
tree5e5154c08e7def83b49b16769c213b0e78ea41fb /src/mem/slicc
parent1c448e2ab00acb05d368c9de62c5cf08e64c6213 (diff)
parentf7de30ab1a9e1655de8bf7d4c15007a682a2a629 (diff)
downloadgem5-589218168c5ae1ed143372e43dbc468369a1bb8f.tar.xz
Automated merge with ssh://hg@m5sim.org/m5
Diffstat (limited to 'src/mem/slicc')
-rw-r--r--src/mem/slicc/ast/PeekStatementAST.py15
-rw-r--r--src/mem/slicc/parser.py4
-rw-r--r--src/mem/slicc/symbols/StateMachine.py217
-rw-r--r--src/mem/slicc/symbols/Type.py6
4 files changed, 34 insertions, 208 deletions
diff --git a/src/mem/slicc/ast/PeekStatementAST.py b/src/mem/slicc/ast/PeekStatementAST.py
index 5186bf0d5..b63ce6516 100644
--- a/src/mem/slicc/ast/PeekStatementAST.py
+++ b/src/mem/slicc/ast/PeekStatementAST.py
@@ -29,8 +29,8 @@ from slicc.ast.StatementAST import StatementAST
from slicc.symbols import Var
class PeekStatementAST(StatementAST):
- def __init__(self, slicc, queue_name, type_ast, statements, method):
- super(PeekStatementAST, self).__init__(slicc)
+ def __init__(self, slicc, queue_name, type_ast, pairs, statements, method):
+ super(PeekStatementAST, self).__init__(slicc, pairs)
self.queue_name = queue_name
self.type_ast = type_ast
@@ -63,6 +63,17 @@ class PeekStatementAST(StatementAST):
in_msg_ptr = dynamic_cast<const $mtid *>(($qcode).${{self.method}}());
assert(in_msg_ptr != NULL);
''')
+ if self.pairs.has_key("block_on"):
+ address_field = self.pairs['block_on']
+ code('''
+ if ( (m_is_blocking == true) &&
+ (m_block_map.count(in_msg_ptr->m_$address_field) == 1) ) {
+ if (m_block_map[in_msg_ptr->m_$address_field] != &$qcode) {
+ $qcode.delayHead();
+ continue;
+ }
+ }
+ ''')
# The other statements
self.statements.generate(code, return_type)
diff --git a/src/mem/slicc/parser.py b/src/mem/slicc/parser.py
index 6c3f45629..226106678 100644
--- a/src/mem/slicc/parser.py
+++ b/src/mem/slicc/parser.py
@@ -514,8 +514,8 @@ class SLICC(Grammar):
p[0] = ast.EnqueueStatementAST(self, p[3], p[5], p[6], p[8])
def p_statement__peek(self, p):
- "statement : PEEK '(' var ',' type ')' statements"
- p[0] = ast.PeekStatementAST(self, p[3], p[5], p[7], "peek")
+ "statement : PEEK '(' var ',' type pairs ')' statements"
+ p[0] = ast.PeekStatementAST(self, p[3], p[5], p[6], p[8], "peek")
def p_statement__copy_head(self, p):
"statement : COPY_HEAD '(' var ',' var pairs ')' SEMI"
diff --git a/src/mem/slicc/symbols/StateMachine.py b/src/mem/slicc/symbols/StateMachine.py
index 008438869..73c3fe720 100644
--- a/src/mem/slicc/symbols/StateMachine.py
+++ b/src/mem/slicc/symbols/StateMachine.py
@@ -185,11 +185,10 @@ public:
void print(ostream& out) const;
void printConfig(ostream& out) const;
void wakeup();
- void set_atomic(Address addr);
- void started_writes();
- void clear_atomic();
void printStats(ostream& out) const { s_profiler.dumpStats(out); }
void clearStats() { s_profiler.clearStats(); }
+ void blockOnQueue(Address addr, MessageBuffer* port);
+ void unblock(Address addr);
private:
''')
@@ -198,17 +197,6 @@ private:
for param in self.config_parameters:
code('int m_${{param.ident}};')
- if self.ident == "L1Cache":
- code('''
-int servicing_atomic;
-bool started_receiving_writes;
-Address locked_read_request1;
-Address locked_read_request2;
-Address locked_read_request3;
-Address locked_read_request4;
-int read_counter;
-''')
-
code('''
int m_number_of_TBEs;
@@ -222,6 +210,8 @@ map< string, string > m_cfg;
NodeID m_version;
Network* m_net_ptr;
MachineID m_machineID;
+bool m_is_blocking;
+map< Address, MessageBuffer* > m_block_map;
${ident}_Profiler s_profiler;
static int m_num_controllers;
// Internal functions
@@ -298,16 +288,6 @@ $c_ident::$c_ident(const string &name)
{
''')
code.indent()
- if self.ident == "L1Cache":
- code('''
-servicing_atomic = 0;
-started_receiving_writes = false;
-locked_read_request1 = Address(-1);
-locked_read_request2 = Address(-1);
-locked_read_request3 = Address(-1);
-locked_read_request4 = Address(-1);
-read_counter = 0;
-''')
code('m_num_controllers++;')
for var in self.objects:
@@ -517,6 +497,17 @@ const MachineType $c_ident::getMachineType() const{
return MachineType_${ident};
}
+void $c_ident::blockOnQueue(Address addr, MessageBuffer* port) {
+ m_is_blocking = true;
+ m_block_map[addr] = port;
+}
+void $c_ident::unblock(Address addr) {
+ m_block_map.erase(addr);
+ if (m_block_map.size() == 0) {
+ m_is_blocking = false;
+ }
+}
+
void $c_ident::print(ostream& out) const { out << "[$c_ident " << m_version << "]"; }
void $c_ident::printConfig(ostream& out) const {
@@ -582,144 +573,12 @@ void ${ident}_Controller::wakeup()
# InPorts
#
- # Find the position of the mandatory queue in the vector so
- # that we can print it out first
-
- mandatory_q = None
- if self.ident == "L1Cache":
- for i,port in enumerate(self.in_ports):
- assert "c_code_in_port" in port
- if str(port).find("mandatoryQueue_in") >= 0:
- assert mandatory_q is None
- mandatory_q = port
-
- assert mandatory_q is not None
-
- # print out the mandatory queue here
- port = mandatory_q
- code('// ${ident}InPort $port')
- output = port["c_code_in_port"]
-
- pos = output.find("TransitionResult result = doTransition((L1Cache_mandatory_request_type_to_event(((*in_msg_ptr)).m_Type)), L1Cache_getState(addr), addr);")
- assert pos >= 0
- atomics_string = '''
-if ((((*in_msg_ptr)).m_Type) == CacheRequestType_ATOMIC) {
- if (servicing_atomic == 0) {
- if (locked_read_request1 == Address(-1)) {
- assert(read_counter == 0);
- locked_read_request1 = addr;
- assert(read_counter == 0);
- read_counter++;
- }
- else if (addr == locked_read_request1) {
- ; // do nothing
- }
- else {
- assert(0); // should never be here if servicing one request at a time
- }
- }
- else if (!started_receiving_writes) {
- if (servicing_atomic == 1) {
- if (locked_read_request2 == Address(-1)) {
- assert(locked_read_request1 != Address(-1));
- assert(read_counter == 1);
- locked_read_request2 = addr;
- assert(read_counter == 1);
- read_counter++;
- }
- else if (addr == locked_read_request2) {
- ; // do nothing
- }
- else {
- assert(0); // should never be here if servicing one request at a time
- }
- }
- else if (servicing_atomic == 2) {
- if (locked_read_request3 == Address(-1)) {
- assert(locked_read_request1 != Address(-1));
- assert(locked_read_request2 != Address(-1));
- assert(read_counter == 1);
- locked_read_request3 = addr;
- assert(read_counter == 2);
- read_counter++;
- }
- else if (addr == locked_read_request3) {
- ; // do nothing
- }
- else {
- assert(0); // should never be here if servicing one request at a time
- }
- }
- else if (servicing_atomic == 3) {
- if (locked_read_request4 == Address(-1)) {
- assert(locked_read_request1 != Address(-1));
- assert(locked_read_request2 != Address(-1));
- assert(locked_read_request3 != Address(-1));
- assert(read_counter == 1);
- locked_read_request4 = addr;
- assert(read_counter == 3);
- read_counter++;
- }
- else if (addr == locked_read_request4) {
- ; // do nothing
- }
- else {
- assert(0); // should never be here if servicing one request at a time
- }
- }
- else {
- assert(0);
- }
- }
-}
-else {
- if (servicing_atomic > 0) {
- // reset
- servicing_atomic = 0;
- read_counter = 0;
- started_receiving_writes = false;
- locked_read_request1 = Address(-1);
- locked_read_request2 = Address(-1);
- locked_read_request3 = Address(-1);
- locked_read_request4 = Address(-1);
- }
-}
-'''
-
- output = output[:pos] + atomics_string + output[pos:]
- code('$output')
-
for port in self.in_ports:
- # don't print out mandatory queue twice
- if port == mandatory_q:
- continue
-
- if ident == "L1Cache":
- if str(port).find("forwardRequestNetwork_in") >= 0:
- code('''
-bool postpone = false;
-if ((((*m_L1Cache_forwardToCache_ptr)).isReady())) {
- const RequestMsg* in_msg_ptr;
- in_msg_ptr = dynamic_cast<const RequestMsg*>(((*m_L1Cache_forwardToCache_ptr)).peek());
- if ((((servicing_atomic == 1) && (locked_read_request1 == ((*in_msg_ptr)).m_Address)) ||
- ((servicing_atomic == 2) && (locked_read_request1 == ((*in_msg_ptr)).m_Address || locked_read_request2 == ((*in_msg_ptr)).m_Address)) ||
- ((servicing_atomic == 3) && (locked_read_request1 == ((*in_msg_ptr)).m_Address || locked_read_request2 == ((*in_msg_ptr)).m_Address || locked_read_request3 == ((*in_msg_ptr)).m_Address)) ||
- ((servicing_atomic == 4) && (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)))) {
- postpone = true;
- }
-}
-if (!postpone) {
-''')
code.indent()
code('// ${ident}InPort $port')
code('${{port["c_code_in_port"]}}')
code.dedent()
- if ident == "L1Cache":
- if str(port).find("forwardRequestNetwork_in") >= 0:
- code.dedent()
- code('}')
- code.indent()
code('')
code.dedent()
@@ -730,52 +589,6 @@ if (!postpone) {
}
''')
- if self.ident == "L1Cache":
- code('''
-void ${ident}_Controller::set_atomic(Address addr)
-{
- servicing_atomic++;
-}
-
-void ${ident}_Controller::started_writes()
-{
- started_receiving_writes = true;
-}
-
-void ${ident}_Controller::clear_atomic()
-{
- assert(servicing_atomic > 0);
- read_counter--;
- servicing_atomic--;
- if (read_counter == 0) {
- servicing_atomic = 0;
- started_receiving_writes = false;
- locked_read_request1 = Address(-1);
- locked_read_request2 = Address(-1);
- locked_read_request3 = Address(-1);
- locked_read_request4 = Address(-1);
- }
-}
-''')
- else:
- code('''
-void ${ident}_Controller::started_writes()
-{
- assert(0);
-}
-
-void ${ident}_Controller::set_atomic(Address addr)
-{
- assert(0);
-}
-
-void ${ident}_Controller::clear_atomic()
-{
- assert(0);
-}
-''')
-
-
code.write(path, "%s_Wakeup.cc" % self.ident)
def printCSwitch(self, path):
diff --git a/src/mem/slicc/symbols/Type.py b/src/mem/slicc/symbols/Type.py
index 2541296dc..bafc6ea9e 100644
--- a/src/mem/slicc/symbols/Type.py
+++ b/src/mem/slicc/symbols/Type.py
@@ -430,8 +430,10 @@ enum ${{self.c_ident}} {
# For each field
for i,(ident,enum) in enumerate(self.enums.iteritems()):
desc = enum.get("desc", "No description avaliable")
- init = ' = %s_FIRST' % self.c_ident if i == 0 else ''
-
+ if i == 0:
+ init = ' = %s_FIRST' % self.c_ident
+ else:
+ init = ''
code('${{self.c_ident}}_${{enum.ident}}$init, /**< $desc */')
code.dedent()
code('''