changeset 79413d1ec307 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=79413d1ec307
description:
slicc: Change the code generation so that the generated code is easier
to read
diffstat:
6 files changed, 258 insertions(+), 119 deletions(-)
src/mem/slicc/ast/AST.py | 10 +
src/mem/slicc/ast/PeekStatementAST.py | 4
src/mem/slicc/generate/html.py | 8 -
src/mem/slicc/symbols/Func.py | 3
src/mem/slicc/symbols/StateMachine.py | 220 ++++++++++++++++++++++-----------
src/mem/slicc/symbols/Type.py | 132 +++++++++++++------
diffs (truncated from 952 to 300 lines):
diff -r 77c9c4d5007d -r 79413d1ec307 src/mem/slicc/ast/AST.py
--- a/src/mem/slicc/ast/AST.py Fri Mar 12 17:31:08 2010 -0800
+++ b/src/mem/slicc/ast/AST.py Fri Mar 12 18:42:56 2010 -0800
@@ -54,8 +54,14 @@
message = message % args
code = self.slicc.codeFormatter()
code('''
-cerr << "Runtime Error at ${{self.location}}, Ruby Time: " <<
g_eventQueue_ptr->getTime() << ": "<< $message << ", PID: " << getpid() << endl;
-char c; cerr << "press return to continue." << endl; cin.get(c); abort();
+char c;
+cerr << "Runtime Error at ${{self.location}}, Ruby Time: "
+ << g_eventQueue_ptr->getTime() << ": "
+ << $message
+ << ", PID: " << getpid() << endl
+ << "press return to continue." << endl;
+cin.get(c);
+abort();
''')
return code
diff -r 77c9c4d5007d -r 79413d1ec307 src/mem/slicc/ast/PeekStatementAST.py
--- a/src/mem/slicc/ast/PeekStatementAST.py Fri Mar 12 17:31:08 2010 -0800
+++ b/src/mem/slicc/ast/PeekStatementAST.py Fri Mar 12 18:42:56 2010 -0800
@@ -59,10 +59,12 @@
qcode = self.queue_name.var.code
code('''
{
+ // Declare message
const $mtid* in_msg_ptr;
in_msg_ptr = dynamic_cast<const $mtid *>(($qcode).${{self.method}}());
- assert(in_msg_ptr != NULL);
+ assert(in_msg_ptr != NULL); // Check the cast result
''')
+
if self.pairs.has_key("block_on"):
address_field = self.pairs['block_on']
code('''
diff -r 77c9c4d5007d -r 79413d1ec307 src/mem/slicc/generate/html.py
--- a/src/mem/slicc/generate/html.py Fri Mar 12 17:31:08 2010 -0800
+++ b/src/mem/slicc/generate/html.py Fri Mar 12 18:42:56 2010 -0800
@@ -29,9 +29,11 @@
def createSymbol(symbol, title):
code = code_formatter()
- code('''<HTML><BODY><BIG>
-$title:
-${{formatShorthand(symbol.short)}} - ${{symbol.desc}}</BIG></BODY></HTML>''')
+ code('''
+<HTML><BODY><BIG>
+$title: ${{formatShorthand(symbol.short)}} - ${{symbol.desc}}
+</BIG></BODY></HTML>
+''')
return code
def formatShorthand(short):
diff -r 77c9c4d5007d -r 79413d1ec307 src/mem/slicc/symbols/Func.py
--- a/src/mem/slicc/symbols/Func.py Fri Mar 12 17:31:08 2010 -0800
+++ b/src/mem/slicc/symbols/Func.py Fri Mar 12 18:42:56 2010 -0800
@@ -95,7 +95,8 @@
params = ', '.join(self.param_strings)
code('''
-$return_type ${klass}::${{self.c_ident}}($params)
+$return_type
+${klass}::${{self.c_ident}}($params)
{
${{self.body}}
}
diff -r 77c9c4d5007d -r 79413d1ec307 src/mem/slicc/symbols/StateMachine.py
--- a/src/mem/slicc/symbols/StateMachine.py Fri Mar 12 17:31:08 2010 -0800
+++ b/src/mem/slicc/symbols/StateMachine.py Fri Mar 12 18:42:56 2010 -0800
@@ -187,14 +187,14 @@
self.message_buffer_names = []
code('''
-/** \\file $ident.hh
+/** \\file $c_ident.hh
*
* Auto generated C++ code started by $__file__:$__line__
* Created by slicc definition of Module "${{self.short}}"
*/
-#ifndef ${ident}_CONTROLLER_H
-#define ${ident}_CONTROLLER_H
+#ifndef __${ident}_CONTROLLER_HH__
+#define __${ident}_CONTROLLER_HH__
#include <iostream>
#include <sstream>
@@ -220,9 +220,11 @@
code('''
extern std::stringstream ${ident}_transitionComment;
-class $c_ident : public AbstractController {
-#ifdef CHECK_COHERENCE
-#endif /* CHECK_COHERENCE */
+class $c_ident : public AbstractController
+{
+// the coherence checker needs to call isBlockExclusive() and isBlockShared()
+// making the Chip a friend class is an easy way to do this for now
+
public:
typedef ${c_ident}Params Params;
$c_ident(const Params *p);
@@ -241,6 +243,7 @@
void clearStats();
void blockOnQueue(Address addr, MessageBuffer* port);
void unblock(Address addr);
+
private:
''')
@@ -255,8 +258,15 @@
code('''
int m_number_of_TBEs;
-TransitionResult doTransition(${ident}_Event event, ${ident}_State state,
const Address& addr); // in ${ident}_Transitions.cc
-TransitionResult doTransitionWorker(${ident}_Event event, ${ident}_State
state, ${ident}_State& next_state, const Address& addr); // in
${ident}_Transitions.cc
+TransitionResult doTransition(${ident}_Event event,
+ ${ident}_State state,
+ const Address& addr);
+
+TransitionResult doTransitionWorker(${ident}_Event event,
+ ${ident}_State state,
+ ${ident}_State& next_state,
+ const Address& addr);
+
std::string m_name;
int m_transitions_per_cycle;
int m_buffer_size;
@@ -269,6 +279,7 @@
map< Address, MessageBuffer* > m_block_map;
${ident}_Profiler s_profiler;
static int m_num_controllers;
+
// Internal functions
''')
@@ -288,7 +299,7 @@
# the controller internal variables
code('''
-// Object
+// Objects
''')
for var in self.objects:
th = var.get("template_hack", "")
@@ -299,7 +310,7 @@
code.dedent()
code('};')
- code('#endif // ${ident}_CONTROLLER_H')
+ code('#endif // __${ident}_CONTROLLER_H__')
code.write(path, '%s.hh' % c_ident)
def printControllerCC(self, path):
@@ -310,7 +321,7 @@
c_ident = "%s_Controller" % self.ident
code('''
-/** \\file $ident.cc
+/** \\file $c_ident.cc
*
* Auto generated C++ code started by $__file__:$__line__
* Created by slicc definition of Module "${{self.short}}"
@@ -344,11 +355,12 @@
return new $c_ident(this);
}
-
int $c_ident::m_num_controllers = 0;
+// for adding information to the protocol debug trace
stringstream ${ident}_transitionComment;
#define APPEND_TRANSITION_COMMENT(str) (${ident}_transitionComment << str)
+
/** \\brief constructor */
$c_ident::$c_ident(const Params *p)
: AbstractController(p)
@@ -411,13 +423,18 @@
code('''
}
-void $c_ident::init()
+void
+$c_ident::init()
{
+ MachineType machine_type;
+ int base;
+
m_machineID.type = MachineType_${ident};
m_machineID.num = m_version;
- // Objects
+ // initialize objects
s_profiler.setVersion(m_version);
+
''')
code.indent()
@@ -445,18 +462,16 @@
args = "m_number_of_TBEs"
else:
args = var.get("constructor_hack", "")
- args = "(%s)" % args
- code('$expr$args;')
- else:
- code(';')
+ code('$expr($args);')
code('assert($vid != NULL);')
if "default" in var:
- code('(*$vid) = ${{var["default"]}}; // Object
default')
+ code('*$vid = ${{var["default"]}}; // Object default')
elif "default" in vtype:
- code('(*$vid) = ${{vtype["default"]}}; // Type
${{vtype.ident}} default')
+ comment = "Type %s default" % vtype.ident
+ code('*$vid = ${{vtype["default"]}}; // $comment')
# Set ordering
if "ordered" in var and "trigger_queue" not in var:
@@ -480,7 +495,9 @@
assert var.machine is not None
code('''
-$vid =
m_net_ptr->get${network}NetQueue(m_version+MachineType_base_number(string_to_MachineType("${{var.machine.ident}}")),
$ordered, $vnet);
+machine_type = string_to_MachineType("${{var.machine.ident}}");
+base = MachineType_base_number(machine_type);
+$vid = m_net_ptr->get${network}NetQueue(m_version + base, $ordered, $vnet);
''')
code('assert($vid != NULL);')
@@ -508,7 +525,10 @@
''')
# set description (may be overriden later by port def)
- code('$vid->setDescription("[Version " +
int_to_string(m_version) + ", ${ident}, name=${{var.c_ident}}]");')
+ code('''
+$vid->setDescription("[Version " + int_to_string(m_version) + ", ${ident},
name=${{var.c_ident}}]");
+
+''')
# Set the queue consumers
code.insert_newline()
@@ -553,51 +573,77 @@
mq_ident = "NULL"
code('''
-int $c_ident::getNumControllers() {
+int
+$c_ident::getNumControllers()
+{
return m_num_controllers;
}
-MessageBuffer* $c_ident::getMandatoryQueue() const {
+MessageBuffer*
+$c_ident::getMandatoryQueue() const
+{
return $mq_ident;
}
-const int & $c_ident::getVersion() const{
+const int &
+$c_ident::getVersion() const
+{
return m_version;
}
-const string $c_ident::toString() const{
+const string
+$c_ident::toString() const
+{
return "$c_ident";
}
-const string $c_ident::getName() const{
+const string
+$c_ident::getName() const
+{
return m_name;
}
-const MachineType $c_ident::getMachineType() const{
+
+const MachineType
+$c_ident::getMachineType() const
+{
return MachineType_${ident};
}
-void $c_ident::blockOnQueue(Address addr, MessageBuffer* port) {
+void
+$c_ident::blockOnQueue(Address addr, MessageBuffer* port)
+{
m_is_blocking = true;
m_block_map[addr] = port;
}
-void $c_ident::unblock(Address addr) {
_______________________________________________
m5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/m5-dev