diff --git a/src/mem/protocol/SConscript b/src/mem/protocol/SConscript
index 700ab40..4252195 100644
--- a/src/mem/protocol/SConscript
+++ b/src/mem/protocol/SConscript
@@ -29,30 +29,56 @@
 # Authors: Nathan Binkert
 
 import os
-import re
-import string
 import sys
 
-from os.path import basename, dirname, exists, expanduser, isdir, isfile
-from os.path import join as joinpath
-
-import SCons
+from os.path import isdir, isfile, join as joinpath
 
 Import('*')
 
 if not env['RUBY']:
     Return()
 
-slicc_dir = Dir('../slicc')
 protocol_dir = Dir('.')
 html_dir = Dir('html')
+slicc_dir = Dir('../slicc')
+
+sys.path[1:1] = [ Dir('..').srcnode().abspath ]
+from slicc.parser import SLICC
+
+slicc_depends = []
+for root,dirs,files in os.walk(slicc_dir.srcnode().abspath):
+    for f in files:
+        if f.endswith('.py'):
+            slicc_depends.append(File(joinpath(root, f)))
 
 #
 # Use SLICC
 #
-def slicc_generator(target, source, env, for_signature):
-    slicc_bin = str(source[0])
-    protocol = source[1].get_contents()
+
+def slicc_scanner(node, env, path):
+    contents = node.get_contents()
+    files = [ line.strip() for line in contents.splitlines() ]
+    return files
+
+env.Append(SCANNERS=Scanner(function=slicc_scanner,skeys=['.slicc']))
+
+def slicc_emitter(target, source, env):
+    files = [s.srcnode().abspath for s in source[1:]]
+    slicc = SLICC(debug=True)
+    print "SLICC parsing..."
+    for name in slicc.load(files, verbose=True):
+        print "    %s" % name
+
+    hh,cc = slicc.files()
+    target.extend(sorted(hh))
+    target.extend(sorted(cc))
+    f = file('/tmp/asdf', 'w')
+    for t in target:
+        print >>f, t
+    return target, source
+
+def slicc_action(target, source, env):
+    protocol = source[0].get_contents()
     pdir = str(protocol_dir)
     hdir = str(html_dir)
 
@@ -61,31 +87,31 @@
     if not isdir(hdir):
         os.mkdir(hdir)
 
-    do_html = "html"
-    cmdline = [ slicc_bin, pdir, hdir, protocol, do_html ]
-    cmdline += [ str(s) for s in source[2:] ]
-    cmdline = ' '.join(cmdline)
-    return cmdline
+    slicc = SLICC(debug=True)
+    files = [str(s) for s in source[1:]]
+    slicc.load(files, verbose=False)
 
-slicc_builder = Builder(generator=slicc_generator)
+    print "SLICC Generator pass 1..."
+    slicc.findMachines()
+
+    print "SLICC Generator pass 2..."
+    slicc.generate()
+
+    print "SLICC writing C++ files..."
+    slicc.writeCodeFiles(pdir)
+
+    print "SLICC writing HTML files..."
+    slicc.writeHTMLFiles(hdir)
+
+slicc_builder = Builder(action=slicc_action, emitter=slicc_emitter)
 
 protocol = env['PROTOCOL']
 sources = [ protocol_dir.File("RubySlicc_interfaces.slicc"),
             protocol_dir.File("%s.slicc" % protocol) ]
 
-execfile(slicc_dir.File('parser/parser.py').srcnode().abspath)
-
-sm_files = read_slicc([s.srcnode().abspath for s in sources])
-sm_files = [ protocol_dir.File(f) for f in sm_files ]
-
-hh, cc = scan([s.srcnode().abspath for s in sm_files])
-hh = [ protocol_dir.File(f) for f in hh ]
-cc = [ protocol_dir.File(f) for f in cc ]
-
-slicc_bin = slicc_dir.File("slicc")
-
 env.Append(BUILDERS={'SLICC' : slicc_builder})
-env.SLICC(hh + cc, [ slicc_bin, Value(protocol) ] + sm_files)
+nodes = env.SLICC([], [ Value(protocol) ] + sources)
+env.Depends(nodes, slicc_depends)
 
-for f in cc:
+for f in sorted(s for s in nodes if str(s).endswith('.cc')):
     Source(f)
diff --git a/src/mem/slicc/SConscript b/src/mem/slicc/SConscript
deleted file mode 100644
index e26ceb9..0000000
--- a/src/mem/slicc/SConscript
+++ /dev/null
@@ -1,129 +0,0 @@
-# -*- mode:python -*-
-
-# Copyright (c) 2009 The Hewlett-Packard Development Company
-# 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.
-#
-# Authors: Nathan Binkert
-
-import os
-import re
-import string
-import sys
-
-from os.path import basename, dirname, exists, expanduser, isdir, isfile
-from os.path import join as joinpath
-
-import SCons
-
-Import('*')
-
-if not env['RUBY']:
-    Return()
-
-common_dir = Dir('../gems_common')
-
-#
-# Build SLICC
-#
-slicc_env = env.Clone()
-slicc_env['CPPDEFINES'] = ''
-slicc_env['CPPPATH'] = Dir('../..')
-slicc_env.Append(CCFLAGS=['-g', '-O0'])
-slicc_env.Append(CPPDEFINES=['DEBUG', 'TRACING_ON=1'])
-slicc_env['LIBS'] = ''
-slicc_env['LIBPATH'] = ''
-all_slicc_sources = []
-def SliccSource(filename):
-    if filename.endswith('.ll') or filename.endswith('.yy'):
-        slicc_env.CXXFile(filename)
-        filename = filename[:-2] + "cc"
-    x = slicc_env.StaticObject(filename)
-    all_slicc_sources.append(x)
-    return x
-
-# BE CAREFUL WITH THE ORDER OF FILENAMES HERE.  SLICC IS VERY FRAGILE
-# BECAUSE IT VIOLATES ESTABLISHED RULES ABOUT HOW YOU'RE ALLOWED TO
-# CREATE STATIC OBJECTS.  (SLICC HAS DEPENDENCIES DURING STATIC OBJECT
-# CONSTRUCTION ACROSS FILES.  THAT'S A NO-NO.)  WITH THIS FILE ORDER,
-# WE GET LUCKY AND OBJECTS GET CONSTRUCTED IN THE RIGHT ORDER.
-SliccSource('parser/parser.yy')
-SliccSource('parser/lexer.ll')
-SliccSource('main.cc')
-SliccSource('symbols/Func.cc')
-SliccSource('symbols/StateMachine.cc')
-SliccSource('symbols/Symbol.cc')
-SliccSource('symbols/SymbolTable.cc')
-SliccSource('symbols/Transition.cc')
-SliccSource('symbols/Type.cc')
-SliccSource('symbols/Var.cc')
-SliccSource('generator/fileio.cc')
-SliccSource('generator/html_gen.cc')
-SliccSource('generator/mif_gen.cc')
-SliccSource('ast/AST.cc')
-SliccSource('ast/ActionDeclAST.cc')
-SliccSource('ast/AssignStatementAST.cc')
-SliccSource('ast/CheckAllocateStatementAST.cc')
-SliccSource('ast/CheckStopSlotsStatementAST.cc')
-SliccSource('ast/ChipComponentAccessAST.cc')
-SliccSource('ast/CopyHeadStatementAST.cc')
-SliccSource('ast/DeclAST.cc')
-SliccSource('ast/DeclListAST.cc')
-SliccSource('ast/EnqueueStatementAST.cc')
-SliccSource('ast/EnumDeclAST.cc')
-SliccSource('ast/EnumExprAST.cc')
-SliccSource('ast/ExprAST.cc')
-SliccSource('ast/ExprStatementAST.cc')
-SliccSource('ast/FormalParamAST.cc')
-SliccSource('ast/FuncCallExprAST.cc')
-SliccSource('ast/FuncDeclAST.cc')
-SliccSource('ast/IfStatementAST.cc')
-SliccSource('ast/InPortDeclAST.cc')
-SliccSource('ast/InfixOperatorExprAST.cc')
-SliccSource('ast/LiteralExprAST.cc')
-SliccSource('ast/Location.cc')
-SliccSource('ast/MachineAST.cc')
-SliccSource('ast/MemberExprAST.cc')
-SliccSource('ast/MethodCallExprAST.cc')
-SliccSource('ast/NewExprAST.cc')
-SliccSource('ast/ObjDeclAST.cc')
-SliccSource('ast/OutPortDeclAST.cc')
-SliccSource('ast/PairAST.cc')
-SliccSource('ast/PairListAST.cc')
-SliccSource('ast/PeekStatementAST.cc')
-SliccSource('ast/ReturnStatementAST.cc')
-SliccSource('ast/StatementAST.cc')
-SliccSource('ast/StatementListAST.cc')
-SliccSource('ast/TransitionDeclAST.cc')
-SliccSource('ast/TypeAST.cc')
-SliccSource('ast/TypeDeclAST.cc')
-SliccSource('ast/TypeFieldAST.cc')
-SliccSource('ast/TypeFieldEnumAST.cc')
-SliccSource('ast/TypeFieldMemberAST.cc')
-SliccSource('ast/TypeFieldMethodAST.cc')
-SliccSource('ast/VarExprAST.cc')
-
-slicc_bin = File('slicc')
-slicc_env.Program(slicc_bin, all_slicc_sources + [ common_dir.File('util.o') ])
diff --git a/src/mem/slicc/__init__.py b/src/mem/slicc/__init__.py
new file mode 100644
index 0000000..8ce04e7
--- /dev/null
+++ b/src/mem/slicc/__init__.py
@@ -0,0 +1,25 @@
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
diff --git a/src/mem/slicc/ast/AST.cc b/src/mem/slicc/ast/AST.cc
deleted file mode 100644
index e893c45..0000000
--- a/src/mem/slicc/ast/AST.cc
+++ /dev/null
@@ -1,39 +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.
- */
-
-/*
- * AST.C
- *
- * Description: See AST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/AST.hh"
diff --git a/src/mem/slicc/ast/AST.hh b/src/mem/slicc/ast/AST.hh
deleted file mode 100644
index 33c9b84..0000000
--- a/src/mem/slicc/ast/AST.hh
+++ /dev/null
@@ -1,94 +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.
- */
-
-/*
- * AST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef AST_H
-#define AST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/gems_common/Vector.hh"
-#include "mem/gems_common/Map.hh"
-#include "mem/slicc/ast/Location.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-
-class AST {
-public:
-  // Constructors
-  AST(Map<string, string> pairs) { m_pairs = pairs; };
-  AST() {};
-  
-  // Destructor
-  virtual ~AST() {};
-  
-  // Public Methods
-  virtual void print(ostream& out) const = 0;
-  void error(string err_msg) const { m_location.error(err_msg); };
-  string embedError(string err_msg) const { return m_location.embedError(err_msg); };
-  void warning(string err_msg) const { m_location.warning(err_msg); };
-  
-  const Location& getLocation() const { return m_location; };
-  
-  const Map<string, string>& getPairs() const { return m_pairs; };
-  Map<string, string>& getPairs() { return m_pairs; };
-  
-private:
-  // Private Methods
-  
-  // Private copy constructor and assignment operator
-  //  AST(const AST& obj);
-  //  AST& operator=(const AST& obj);
-  
-  // Data Members (m_ prefix)
-  Location m_location;
-  Map<string, string> m_pairs;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const AST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const AST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //AST_H
diff --git a/src/mem/slicc/ast/AST.py b/src/mem/slicc/ast/AST.py
new file mode 100644
index 0000000..5b1b124
--- /dev/null
+++ b/src/mem/slicc/ast/AST.py
@@ -0,0 +1,63 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util import code_formatter
+
+from slicc.util import PairContainer, Location
+
+class AST(PairContainer):
+    def __init__(self, slicc, pairs=None):
+        self.slicc = slicc
+        self.location = Location(slicc.current_file, slicc.lexer.lineno)
+        self.pairs = {}
+        if pairs:
+            self.pairs.update(getattr(pairs, "pairs", pairs))
+
+    @property
+    def symtab(self):
+        return self.slicc.symtab
+
+    @property
+    def state_machine(self):
+        return self.slicc.symtab.state_machine
+
+    def warning(self, message, *args):
+        self.location.warning(message, *args)
+
+    def error(self, message, *args):
+        self.location.error(message, *args)
+
+    def embedError(self, message, *args):
+        if args:
+            message = message % args
+        code = code_formatter()
+        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();
+''')
+
+        return code
diff --git a/src/mem/slicc/ast/ASTs.hh b/src/mem/slicc/ast/ASTs.hh
deleted file mode 100644
index 3363fbb..0000000
--- a/src/mem/slicc/ast/ASTs.hh
+++ /dev/null
@@ -1,91 +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$
- *
- */
-
-#ifndef ASTs_H
-#define ASTs_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/main.hh"
-#include "mem/slicc/symbols/StateMachine.hh"
-#include "mem/slicc/ast/AST.hh"
-
-#include "mem/slicc/ast/MachineAST.hh"
-
-#include "mem/slicc/ast/TypeAST.hh"
-#include "mem/slicc/ast/FormalParamAST.hh"
-
-#include "mem/slicc/ast/DeclListAST.hh"
-#include "mem/slicc/ast/DeclAST.hh"
-#include "mem/slicc/ast/ActionDeclAST.hh"
-#include "mem/slicc/ast/InPortDeclAST.hh"
-#include "mem/slicc/ast/OutPortDeclAST.hh"
-#include "mem/slicc/ast/TransitionDeclAST.hh"
-#include "mem/slicc/ast/EnumDeclAST.hh"
-#include "mem/slicc/ast/TypeDeclAST.hh"
-#include "mem/slicc/ast/ObjDeclAST.hh"
-#include "mem/slicc/ast/FuncDeclAST.hh"
-
-#include "mem/slicc/ast/TypeFieldAST.hh"
-#include "mem/slicc/ast/TypeFieldMethodAST.hh"
-#include "mem/slicc/ast/TypeFieldMemberAST.hh"
-#include "mem/slicc/ast/TypeFieldEnumAST.hh"
-
-#include "mem/slicc/ast/PairAST.hh"
-#include "mem/slicc/ast/PairListAST.hh"
-
-#include "mem/slicc/ast/ExprAST.hh"
-#include "mem/slicc/ast/VarExprAST.hh"
-#include "mem/slicc/ast/EnumExprAST.hh"
-#include "mem/slicc/ast/LiteralExprAST.hh"
-#include "mem/slicc/ast/MemberExprAST.hh"
-#include "mem/slicc/ast/InfixOperatorExprAST.hh"
-#include "mem/slicc/ast/FuncCallExprAST.hh"
-#include "mem/slicc/ast/MethodCallExprAST.hh"
-#include "mem/slicc/ast/NewExprAST.hh"
-
-#include "mem/slicc/ast/ChipComponentAccessAST.hh"
-
-#include "mem/slicc/ast/StatementListAST.hh"
-#include "mem/slicc/ast/StatementAST.hh"
-#include "mem/slicc/ast/ExprStatementAST.hh"
-#include "mem/slicc/ast/AssignStatementAST.hh"
-#include "mem/slicc/ast/EnqueueStatementAST.hh"
-#include "mem/slicc/ast/IfStatementAST.hh"
-#include "mem/slicc/ast/PeekStatementAST.hh"
-#include "mem/slicc/ast/CopyHeadStatementAST.hh"
-#include "mem/slicc/ast/CheckAllocateStatementAST.hh"
-#include "mem/slicc/ast/CheckStopSlotsStatementAST.hh"
-#include "mem/slicc/ast/ReturnStatementAST.hh"
-
-#endif //ASTs_H
diff --git a/src/mem/slicc/ast/ActionDeclAST.cc b/src/mem/slicc/ast/ActionDeclAST.cc
deleted file mode 100644
index e46412f..0000000
--- a/src/mem/slicc/ast/ActionDeclAST.cc
+++ /dev/null
@@ -1,98 +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.
- */
-
-/*
- * ActionDeclAST.C
- *
- * Description: See ActionDeclAST.hh
- *
- * $Id$
- *
- */
-
-
-#include "mem/slicc/ast/ActionDeclAST.hh"
-#include "mem/slicc/symbols/Action.hh"
-#include "mem/slicc/ast/StatementListAST.hh"
-
-ActionDeclAST::ActionDeclAST(string* ident_ptr,
-                             PairListAST* pairs_ptr,
-                             StatementListAST* statement_list_ptr)
-  : DeclAST(pairs_ptr)
-{
-  m_ident_ptr = ident_ptr;
-  m_statement_list_ptr = statement_list_ptr;
-}
-
-ActionDeclAST::~ActionDeclAST()
-{
-  delete m_ident_ptr;
-  delete m_statement_list_ptr;
-}
-
-void ActionDeclAST::generate()
-{
-  Map<Var*, string> resource_list;
-  if (m_statement_list_ptr != NULL) {
-    string code;
-
-    // Add new local vars
-    g_sym_table.pushFrame();
-
-    Type* type_ptr = g_sym_table.getType("Address");
-
-    if (type_ptr == NULL) {
-      error("Type 'Address' not declared.");
-    }
-
-    g_sym_table.newSym(new Var("address", getLocation(), type_ptr, "addr", getPairs()));
-
-    // Don't allows returns in actions
-    m_statement_list_ptr->generate(code, NULL);
-
-    getPairs().add("c_code", code);
-
-    m_statement_list_ptr->findResources(resource_list);
-
-    g_sym_table.popFrame();
-  }
-
-  StateMachine* machine_ptr = g_sym_table.getStateMachine();
-  if (machine_ptr == NULL) {
-    error("Action declaration not part of a machine.");
-  } else {
-    machine_ptr->addAction(new Action(*m_ident_ptr, resource_list, getLocation(), getPairs()));
-  }
-
-}
-
-void ActionDeclAST::print(ostream& out) const
-{
-  out << "[ActionDecl: " << *m_ident_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/ActionDeclAST.hh b/src/mem/slicc/ast/ActionDeclAST.hh
deleted file mode 100644
index 4970ee2..0000000
--- a/src/mem/slicc/ast/ActionDeclAST.hh
+++ /dev/null
@@ -1,86 +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.
- */
-
-/*
- * ActionDeclAST.hh
- *
- * Description:
- *
- * $Id: ActionDeclAST.hh,v 3.2 2003/07/10 18:08:06 milo Exp $
- *
- */
-
-#ifndef ActionDeclAST_H
-#define ActionDeclAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/DeclAST.hh"
-
-class StatementListAST;
-
-class ActionDeclAST : public DeclAST {
-public:
-  // Constructors
-  ActionDeclAST(string* ident_ptr,
-                PairListAST* pairs_ptr,
-                StatementListAST* statement_list_ptr);
-
-  // Destructor
-  ~ActionDeclAST();
-
-  // Public Methods
-  void generate();
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  ActionDeclAST(const ActionDeclAST& obj);
-  ActionDeclAST& operator=(const ActionDeclAST& obj);
-
-  // Data Members (m_ prefix)
-  string* m_ident_ptr;
-  StatementListAST* m_statement_list_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const ActionDeclAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const ActionDeclAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //ActionDeclAST_H
diff --git a/src/mem/slicc/ast/ActionDeclAST.py b/src/mem/slicc/ast/ActionDeclAST.py
new file mode 100644
index 0000000..18bf443
--- /dev/null
+++ b/src/mem/slicc/ast/ActionDeclAST.py
@@ -0,0 +1,72 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util import code_formatter
+
+from slicc.ast.DeclAST import DeclAST
+from slicc.symbols import Action, Type, Var
+
+class ActionDeclAST(DeclAST):
+    def __init__(self, slicc, ident, pairs, statement_list):
+        super(ActionDeclAST, self).__init__(slicc, pairs)
+        self.ident = ident
+        self.statement_list = statement_list
+
+    def __repr__(self):
+        return "[ActionDecl: %r]" % (self.ident)
+
+    def generate(self):
+        resources = {}
+        if self.statement_list:
+            # Add new local vars
+            self.symtab.pushFrame()
+
+            addr_type = self.symtab.find("Address", Type)
+
+            if addr_type is None:
+                self.error("Type 'Address' not declared.")
+
+            var = Var(self.symtab, "address", self.location, addr_type,
+                      "addr", self.pairs)
+            self.symtab.newSymbol(var)
+
+            # Do not allows returns in actions
+            code = code_formatter()
+            self.statement_list.generate(code, None)
+            self.pairs["c_code"] = str(code)
+
+            self.statement_list.findResources(resources)
+
+            self.symtab.popFrame()
+
+        machine = self.symtab.state_machine
+        if machine is None:
+            self.error("Action declaration not part of a machine.")
+
+        action = Action(self.symtab, self.ident, resources, self.location,
+                        self.pairs)
+        machine.addAction(action)
diff --git a/src/mem/slicc/ast/AssignStatementAST.cc b/src/mem/slicc/ast/AssignStatementAST.cc
deleted file mode 100644
index 8cf42aa..0000000
--- a/src/mem/slicc/ast/AssignStatementAST.cc
+++ /dev/null
@@ -1,76 +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.
- */
-
-/*
- * AssignStatementAST.C
- *
- * Description: See AssignStatementAST.hh
- *
- * $Id: AssignStatementAST.C,v 3.2 2003/08/01 18:38:19 beckmann Exp $
- *
- */
-
-#include "mem/slicc/ast/AssignStatementAST.hh"
-
-AssignStatementAST::AssignStatementAST(ExprAST* lvalue_ptr, ExprAST* rvalue_ptr)
-  : StatementAST()
-{
-  m_lvalue_ptr = lvalue_ptr;
-  m_rvalue_ptr = rvalue_ptr;
-}
-
-AssignStatementAST::~AssignStatementAST()
-{
-  delete m_lvalue_ptr;
-  delete m_rvalue_ptr;
-}
-
-void AssignStatementAST::generate(string& code, Type* return_type_ptr) const
-{
-  code += indent_str();
-  Type* lvalue_type_ptr = m_lvalue_ptr->generate(code);
-  code += " = ";
-  Type* rvalue_type_ptr = m_rvalue_ptr->generate(code);
-  code += ";\n";
-
-  if (lvalue_type_ptr != rvalue_type_ptr) {
-    // FIXME - beckmann
-    // the following if statement is a hack to allow NetDest objects to be assigned to Sets
-    // this allows for the previous NetworkMessage Destiantion 'Set class' to migrate to the
-    // new NetworkMessage Destiantion 'NetDest class'
-    if (lvalue_type_ptr->toString() != "NetDest" && rvalue_type_ptr->toString() != "Set") {
-      error("Assignment type mismatch '" + lvalue_type_ptr->toString() + "' and '" + rvalue_type_ptr->toString() + "'");
-    }
-  }
-}
-
-void AssignStatementAST::print(ostream& out) const
-{
-  out << "[AssignStatementAST: " << *m_lvalue_ptr << " := " << *m_rvalue_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/AssignStatementAST.hh b/src/mem/slicc/ast/AssignStatementAST.hh
deleted file mode 100644
index 2c19da8..0000000
--- a/src/mem/slicc/ast/AssignStatementAST.hh
+++ /dev/null
@@ -1,85 +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.
- */
-
-/*
- * AssignStatementAST.hh
- *
- * Description:
- *
- * $Id: AssignStatementAST.hh,v 3.2 2001/12/12 01:00:09 milo Exp $
- *
- */
-
-#ifndef ASSIGNSTATEMENTAST_H
-#define ASSIGNSTATEMENTAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/StatementAST.hh"
-#include "mem/slicc/ast/ExprAST.hh"
-
-
-
-class AssignStatementAST : public StatementAST {
-public:
-  // Constructors
-  AssignStatementAST(ExprAST* lvalue_ptr, ExprAST* rvalue_ptr);
-
-  // Destructor
-  ~AssignStatementAST();
-
-  // Public Methods
-  void generate(string& code, Type* return_type_ptr) const;
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  AssignStatementAST(const AssignStatementAST& obj);
-  AssignStatementAST& operator=(const AssignStatementAST& obj);
-
-  // Data Members (m_ prefix)
-  ExprAST* m_lvalue_ptr;
-  ExprAST* m_rvalue_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const AssignStatementAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const AssignStatementAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //ASSIGNSTATEMENTAST_H
diff --git a/src/mem/slicc/ast/AssignStatementAST.py b/src/mem/slicc/ast/AssignStatementAST.py
new file mode 100644
index 0000000..f8e77b0
--- /dev/null
+++ b/src/mem/slicc/ast/AssignStatementAST.py
@@ -0,0 +1,59 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util import code_formatter
+
+from slicc.ast.StatementAST import StatementAST
+
+class AssignStatementAST(StatementAST):
+    def __init__(self, slicc, lvalue, rvalue):
+        super(AssignStatementAST, self).__init__(slicc)
+        self.lvalue = lvalue
+        self.rvalue = rvalue
+
+    def __repr__(self):
+        return "[AssignStatementAST: %r := %r]" % (self.lvalue, self.rvalue)
+
+    def generate(self, code, return_type):
+        lcode = code_formatter()
+        rcode = code_formatter()
+
+        ltype = self.lvalue.generate(lcode)
+        rtype = self.rvalue.generate(rcode)
+
+        code("$lcode = $rcode;")
+
+        if ltype != rtype:
+            # FIXME - beckmann
+            # the following if statement is a hack to allow NetDest
+            # objects to be assigned to Sets this allows for the
+            # previous NetworkMessage Destiantion 'Set class' to
+            # migrate to the new NetworkMessage Destiantion 'NetDest
+            # class'
+            if str(ltype) != "NetDest" and str(rtype) != "Set":
+                self.error("Assignment type mismatch '%s' and '%s'",
+                           ltype, rtype)
diff --git a/src/mem/slicc/ast/CheckAllocateStatementAST.cc b/src/mem/slicc/ast/CheckAllocateStatementAST.cc
deleted file mode 100644
index 1f498ef..0000000
--- a/src/mem/slicc/ast/CheckAllocateStatementAST.cc
+++ /dev/null
@@ -1,72 +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/ast/CheckAllocateStatementAST.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-#include "mem/slicc/ast/VarExprAST.hh"
-#include "mem/gems_common/util.hh"
-
-CheckAllocateStatementAST::CheckAllocateStatementAST(VarExprAST* variable)
-  : StatementAST()
-{
-  m_variable = variable;
-}
-
-CheckAllocateStatementAST::~CheckAllocateStatementAST()
-{
-  delete m_variable;
-}
-
-void CheckAllocateStatementAST::generate(string& code, Type* return_type_ptr) const
-{
-  // FIXME - check the type of the variable
-
-  // Make sure the variable is valid
-  m_variable->getVar();
-}
-
-void CheckAllocateStatementAST::findResources(Map<Var*, string>& resource_list) const
-{
-  Var* var_ptr = m_variable->getVar();
-  int res_count = 0;
-  if (resource_list.exist(var_ptr)) {
-    res_count = atoi((resource_list.lookup(var_ptr)).c_str());
-  }
-  resource_list.add(var_ptr, int_to_string(res_count+1));
-}
-
-void CheckAllocateStatementAST::print(ostream& out) const
-{
-  out << "[CheckAllocateStatementAst: " << *m_variable << "]";
-}
diff --git a/src/mem/slicc/ast/CheckAllocateStatementAST.hh b/src/mem/slicc/ast/CheckAllocateStatementAST.hh
deleted file mode 100644
index 1df8535..0000000
--- a/src/mem/slicc/ast/CheckAllocateStatementAST.hh
+++ /dev/null
@@ -1,82 +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$
- *
- */
-
-#ifndef CHECKALLOCATESTATEMENTAST_H
-#define CHECKALLOCATESTATEMENTAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/StatementAST.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-
-class VarExprAST;
-class Var;
-
-class CheckAllocateStatementAST : public StatementAST {
-public:
-  // Constructors
-  CheckAllocateStatementAST(VarExprAST* variable);
-
-  // Destructor
-  ~CheckAllocateStatementAST();
-
-  // Public Methods
-  void generate(string& code, Type* return_type_ptr) const;
-  void findResources(Map<Var*, string>& resource_list) const;
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  CheckAllocateStatementAST(const CheckAllocateStatementAST& obj);
-  CheckAllocateStatementAST& operator=(const CheckAllocateStatementAST& obj);
-
-  // Data Members (m_ prefix)
-  VarExprAST* m_variable;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const CheckAllocateStatementAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const CheckAllocateStatementAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //CHECKALLOCATESTATEMENTAST_H
diff --git a/src/mem/slicc/ast/CheckAllocateStatementAST.py b/src/mem/slicc/ast/CheckAllocateStatementAST.py
new file mode 100644
index 0000000..b96153b
--- /dev/null
+++ b/src/mem/slicc/ast/CheckAllocateStatementAST.py
@@ -0,0 +1,47 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.StatementAST import StatementAST
+
+class CheckAllocateStatementAST(StatementAST):
+    def __init__(self, slicc, variable):
+        super(StatementAST, self).__init__(slicc)
+        self.variable = variable
+
+    def __repr__(self):
+        return "[CheckAllocateStatementAst: %r]" % self.variable
+
+    def generate(self, code, return_type):
+        # FIXME - check the type of the variable
+
+        # Make sure the variable is valid
+        self.variable.var
+
+    def findResources(self, resources):
+        var = self.variable.var
+        res_count = int(resources.get(var, 0))
+        resources[var] = str(res_count + 1)
diff --git a/src/mem/slicc/ast/CheckStopSlotsStatementAST.cc b/src/mem/slicc/ast/CheckStopSlotsStatementAST.cc
deleted file mode 100644
index 38dc449..0000000
--- a/src/mem/slicc/ast/CheckStopSlotsStatementAST.cc
+++ /dev/null
@@ -1,115 +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/ast/CheckStopSlotsStatementAST.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-#include "mem/slicc/ast/VarExprAST.hh"
-#include "mem/slicc/ast/PairListAST.hh"
-
-CheckStopSlotsStatementAST::CheckStopSlotsStatementAST(VarExprAST* variable, string* condStr, string* bankStr)
-  : StatementAST()
-{
-  m_variable = variable;
-  m_condStr_ptr = condStr;
-  m_bankStr_ptr = bankStr;
-}
-
-CheckStopSlotsStatementAST::~CheckStopSlotsStatementAST()
-{
-  delete m_variable;
-  delete m_condStr_ptr;
-  delete m_bankStr_ptr;
-}
-
-void CheckStopSlotsStatementAST::generate(string& code, Type* return_type_ptr) const
-{
-
-  // Make sure the variable is valid
-  m_variable->getVar();
-
-}
-
-void CheckStopSlotsStatementAST::findResources(Map<Var*, string>& resource_list) const
-{
-  Type* type_ptr;
-
-  Var* var_ptr = m_variable->getVar();
-  string check_code;
-
-  if (*m_condStr_ptr == "((*in_msg_ptr)).m_isOnChipSearch") {
-    check_code += "    const Response9Msg* in_msg_ptr;\n";
-    check_code += "    in_msg_ptr = dynamic_cast<const Response9Msg*>(((*(m_chip_ptr->m_L2Cache_responseToL2Cache9_vec[m_version]))).peek());\n";
-    check_code += "    assert(in_msg_ptr != NULL);\n";
-  }
-
-  check_code += "    if (";
-  check_code += *m_condStr_ptr;
-  check_code += ") {\n";
-
-  check_code += "      if (!";
-  type_ptr = m_variable->generate(check_code);
-  check_code += ".isDisableSPossible((((*(m_chip_ptr->m_DNUCAmover_ptr))).getBankPos(";
-  check_code += *m_bankStr_ptr;
-  check_code += ")))) {\n";
-  if(CHECK_INVALID_RESOURCE_STALLS) {
-    check_code += "        assert(priority >= ";
-    type_ptr = m_variable->generate(check_code);
-    check_code += ".getPriority());\n";
-  }
-  check_code += "        return TransitionResult_ResourceStall;\n";
-  check_code += "      }\n";
-  check_code += "    } else {\n";
-  check_code += "      if (!";
-  type_ptr = m_variable->generate(check_code);
-  check_code += ".isDisableFPossible((((*(m_chip_ptr->m_DNUCAmover_ptr))).getBankPos(";
-  check_code += *m_bankStr_ptr;
-  check_code += ")))) {\n";
-  if(CHECK_INVALID_RESOURCE_STALLS) {
-    check_code += "        assert(priority >= ";
-    type_ptr = m_variable->generate(check_code);
-    check_code += ".getPriority());\n";
-  }
-  check_code += "        return TransitionResult_ResourceStall;\n";
-  check_code += "      }\n";
-  check_code += "    }\n";
-
-  assert(!resource_list.exist(var_ptr));
-  resource_list.add(var_ptr, check_code);
-
-}
-
-void CheckStopSlotsStatementAST::print(ostream& out) const
-{
-  out << "[CheckStopSlotsStatementAst: " << *m_variable << "]";
-}
diff --git a/src/mem/slicc/ast/CheckStopSlotsStatementAST.hh b/src/mem/slicc/ast/CheckStopSlotsStatementAST.hh
deleted file mode 100644
index 6de068c..0000000
--- a/src/mem/slicc/ast/CheckStopSlotsStatementAST.hh
+++ /dev/null
@@ -1,85 +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$
- *
- */
-
-#ifndef CHECKSTOPSLOTSSTATEMENTAST_H
-#define CHECKSTOPSLOTSSTATEMENTAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/ExprAST.hh"
-#include "mem/slicc/ast/StatementAST.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-
-class VarExprAST;
-class Var;
-
-class CheckStopSlotsStatementAST : public StatementAST {
-public:
-  // Constructors
-  CheckStopSlotsStatementAST(VarExprAST* variable, string* condStr, string* bankStr);
-
-  // Destructor
-  ~CheckStopSlotsStatementAST();
-
-  // Public Methods
-  void generate(string& code, Type* return_type_ptr) const;
-  void findResources(Map<Var*, string>& resource_list) const;
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  CheckStopSlotsStatementAST(const CheckStopSlotsStatementAST& obj);
-  CheckStopSlotsStatementAST& operator=(const CheckStopSlotsStatementAST& obj);
-
-  // Data Members (m_ prefix)
-  VarExprAST* m_variable;
-  string* m_condStr_ptr;
-  string* m_bankStr_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const CheckStopSlotsStatementAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const CheckStopSlotsStatementAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //CHECKSTOPSLOTSSTATEMENTAST_H
diff --git a/src/mem/slicc/ast/CheckStopSlotsStatementAST.py b/src/mem/slicc/ast/CheckStopSlotsStatementAST.py
new file mode 100644
index 0000000..307fbd6
--- /dev/null
+++ b/src/mem/slicc/ast/CheckStopSlotsStatementAST.py
@@ -0,0 +1,74 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.StatementAST import StatementAST
+
+class CheckStopSlotsStatementAST(StatementAST):
+    def __init__(self, slicc, variable, condStr, bankStr):
+        super(StatementAST, self).__init__(slicc)
+        self.variable = variable
+        self.condStr = condStr
+        self.bankStr = bankStr
+
+    def __repr__(self):
+        return "[CheckStopSlotsStatementAst: %r]" % self.variable
+
+    def generate(self, code, return_type):
+        # Make sure the variable is valid
+        self.variable.var
+
+    def findResources(self, resources):
+        var = self.variable.var
+        assert var not in self.resources
+
+        check_code = code_formatter()
+        if self.condStr == "((*in_msg_ptr)).m_isOnChipSearch":
+            check_code('''
+const Response9Msg* in_msg_ptr =
+    dynamic_cast<const Response9Msg*>(((*(m_chip_ptr.m_L2Cache_responseToL2Cache9_vec[m_version]))).peek());
+assert(in_msg_ptr != NULL);
+''')
+
+        vcode = self.variable.inline()
+        bank = self.bankStr
+        cond = self.condStr
+
+        check_code('''
+if ($cond) {
+    auto pos = m_chip_ptr.m_DNUCAmover_ptr->getBankPos($bank)
+
+    if (!$vcode.isDisableSPossible(pos)) {
+        return TransitionResult_ResourceStall;
+    }
+} else {
+    if (!$vcode.isDisableFPossible(pos)) {
+        return TransitionResult_ResourceStall;
+    }
+}
+''')
+
+        resources[var] = str(check_code)
diff --git a/src/mem/slicc/ast/ChipComponentAccessAST.cc b/src/mem/slicc/ast/ChipComponentAccessAST.cc
deleted file mode 100644
index 61dccf2..0000000
--- a/src/mem/slicc/ast/ChipComponentAccessAST.cc
+++ /dev/null
@@ -1,244 +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.
- */
-
-/*
- * ChipComponentAccessAST.C
- *
- * Description: See ChipComponentAccessAST.hh
- *
- * $Id: ChipComponentAccessAST.C 1.9 04/06/18 21:00:08-00:00 beckmann@cottons.cs.wisc.edu $
- *
- */
-
-#include "mem/slicc/ast/ChipComponentAccessAST.hh"
-
-ChipComponentAccessAST::ChipComponentAccessAST(VarExprAST* machine, ExprAST* mach_version, VarExprAST* component, string* proc_name, Vector<ExprAST*>* expr_vec_ptr)
-
-  : ExprAST()
-{
-  m_chip_ver_expr_ptr = NULL;
-  m_mach_var_ptr = machine;
-  m_comp_var_ptr = component;
-  m_mach_ver_expr_ptr = mach_version;
-  m_expr_vec_ptr = expr_vec_ptr;
-  m_proc_name_ptr = proc_name;
-  m_field_name_ptr = NULL;
-}
-
-ChipComponentAccessAST::ChipComponentAccessAST(VarExprAST* machine, ExprAST* mach_version, VarExprAST* component, string* field_name)
-
-  : ExprAST()
-{
-  m_chip_ver_expr_ptr = NULL;
-  m_mach_var_ptr = machine;
-  m_comp_var_ptr = component;
-  m_mach_ver_expr_ptr = mach_version;
-  m_expr_vec_ptr = NULL;
-  m_proc_name_ptr = NULL;
-  m_field_name_ptr = field_name;
-}
-
-ChipComponentAccessAST::ChipComponentAccessAST(ExprAST* chip_version, VarExprAST* machine, ExprAST* mach_version, VarExprAST* component, string* proc_name, Vector<ExprAST*>* expr_vec_ptr)
-
-  : ExprAST()
-{
-  m_chip_ver_expr_ptr = chip_version;
-  m_mach_var_ptr = machine;
-  m_comp_var_ptr = component;
-  m_mach_ver_expr_ptr = mach_version;
-  m_expr_vec_ptr = expr_vec_ptr;
-  m_proc_name_ptr = proc_name;
-  m_field_name_ptr = NULL;
-}
-
-ChipComponentAccessAST::ChipComponentAccessAST(ExprAST* chip_version, VarExprAST* machine, ExprAST* mach_version, VarExprAST* component, string* field_name)
-
-  : ExprAST()
-{
-  m_chip_ver_expr_ptr = chip_version;
-  m_mach_var_ptr = machine;
-  m_comp_var_ptr = component;
-  m_mach_ver_expr_ptr = mach_version;
-  m_expr_vec_ptr = NULL;
-  m_proc_name_ptr = NULL;
-  m_field_name_ptr = field_name;
-}
-
-
-
-ChipComponentAccessAST::~ChipComponentAccessAST()
-{
-  if (m_expr_vec_ptr != NULL) {
-    int size = m_expr_vec_ptr->size();
-    for(int i=0; i<size; i++) {
-      delete (*m_expr_vec_ptr)[i];
-    }
-  }
-
-  delete m_mach_var_ptr;
-  delete m_comp_var_ptr;
-  delete m_mach_ver_expr_ptr;
-
-  if (m_proc_name_ptr != NULL) {
-    delete m_proc_name_ptr;
-  }
-
-  if (m_field_name_ptr != NULL) {
-    delete m_field_name_ptr;
-  }
-
-  if (m_chip_ver_expr_ptr != NULL) {
-    delete m_chip_ver_expr_ptr;
-  }
-}
-
-Type* ChipComponentAccessAST::generate(string& code) const
-{
-  Type* void_type_ptr = g_sym_table.getType("void");
-  Type* ret_type_ptr;
-
-
-  code += "(";
-
-  Var* v = g_sym_table.getMachComponentVar(m_mach_var_ptr->getName(), m_comp_var_ptr->getName());
-
-  string orig_code = v->getCode();
-  string working_code;
-
-  if (m_chip_ver_expr_ptr != NULL) {
-    // replace m_chip_ptr with specified chip
-
-    unsigned int t = orig_code.find("m_chip_ptr");
-    assert(t != string::npos);
-    string code_temp0 = orig_code.substr(0, t);
-    string code_temp1 = orig_code.substr(t+10);
-
-    working_code += code_temp0;
-    working_code += "g_system_ptr->getChip(";
-    m_chip_ver_expr_ptr->generate(working_code);
-    working_code += ")";
-    working_code += code_temp1;
-  }
-  else {
-    working_code += orig_code;
-  }
-
-  // replace default "m_version" with the version we really want
-  unsigned int tmp_uint = working_code.find("m_version");
-  assert(tmp_uint != string::npos);
-  string code_temp2 = working_code.substr(0, tmp_uint);
-  string code_temp3 = working_code.substr(tmp_uint+9);
-
-  code += code_temp2;
-  code += "(";
-  m_mach_ver_expr_ptr->generate(code);
-  code += ")";
-  code += code_temp3;
-  code += ")";
-
-  if (m_proc_name_ptr != NULL) {
-    // method call
-    code += ".";
-
-    Vector <Type*> paramTypes;
-
-    // generate code
-    int actual_size = m_expr_vec_ptr->size();
-    code += (*m_proc_name_ptr) + "(";
-    for(int i=0; i<actual_size; i++) {
-      if (i != 0) {
-        code += ", ";
-      }
-      // Check the types of the parameter
-      Type* actual_type_ptr = (*m_expr_vec_ptr)[i]->generate(code);
-      paramTypes.insertAtBottom(actual_type_ptr);
-    }
-    code += ")";
-
-    Type* obj_type_ptr = v->getType();
-    string methodId = obj_type_ptr->methodId(*m_proc_name_ptr, paramTypes);
-
-    // Verify that this is a method of the object
-    if (!obj_type_ptr->methodExist(methodId)) {
-      error("Invalid method call: Type '" + obj_type_ptr->toString() + "' does not have a method '" + methodId + "'");
-    }
-
-    int expected_size = obj_type_ptr->methodParamType(methodId).size();
-    if (actual_size != expected_size) {
-      // Right number of parameters
-      ostringstream err;
-      err << "Wrong number of parameters for function name: '" << *m_proc_name_ptr << "'";
-      err << ", expected: ";
-      err << expected_size;
-      err << ", actual: ";
-      err << actual_size;
-      error(err.str());
-    }
-
-    for(int i=0; i<actual_size; i++) {
-      // Check the types of the parameter
-      Type* actual_type_ptr = paramTypes[i];
-      Type* expected_type_ptr = obj_type_ptr->methodParamType(methodId)[i];
-      if (actual_type_ptr != expected_type_ptr) {
-        (*m_expr_vec_ptr)[i]->error("Type mismatch: expected: " + expected_type_ptr->toString() +
-                                    " actual: " + actual_type_ptr->toString());
-      }
-    }
-
-    // Return the return type of the method
-    ret_type_ptr = obj_type_ptr->methodReturnType(methodId);
-  }
-  else if (m_field_name_ptr != NULL) {
-    Type* obj_type_ptr = v->getType();
-    code += ").m_" + (*m_field_name_ptr);
-
-    // Verify that this is a valid field name for this type
-    if (!obj_type_ptr->dataMemberExist(*m_field_name_ptr)) {
-      error("Invalid object field: Type '" + obj_type_ptr->toString() + "' does not have data member " + *m_field_name_ptr);
-    }
-
-    // Return the type of the field
-    ret_type_ptr = obj_type_ptr->dataMemberType(*m_field_name_ptr);
-  }
-  else {
-    assert(0);
-  }
-
-  return ret_type_ptr;
-}
-
-void ChipComponentAccessAST::findResources(Map<Var*, string>& resource_list) const
-{
-
-}
-
-void ChipComponentAccessAST::print(ostream& out) const
-{
-  out << "[ChipAccessExpr: " << *m_expr_vec_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/ChipComponentAccessAST.hh b/src/mem/slicc/ast/ChipComponentAccessAST.hh
deleted file mode 100644
index 1f22a79..0000000
--- a/src/mem/slicc/ast/ChipComponentAccessAST.hh
+++ /dev/null
@@ -1,101 +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.
- */
-
-/*
- *
- *
- * Description:
- *
- * $Id: ChipComponentAccessAST.hh 1.8 04/06/18 21:00:08-00:00 beckmann@cottons.cs.wisc.edu $
- *
- */
-
-#ifndef ChipComponentAccessAST_H
-#define ChipComponentAccessAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/StatementAST.hh"
-#include "mem/slicc/ast/ExprAST.hh"
-#include "mem/slicc/ast/VarExprAST.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-
-class ChipComponentAccessAST : public ExprAST {
-public:
-  // Constructors
-
-  // method call from local chip
-  ChipComponentAccessAST(VarExprAST* machine, ExprAST* mach_version, VarExprAST* component, string* proc_name, Vector<ExprAST*>* expr_vec_ptr);
-  // member access from local chip
-  ChipComponentAccessAST(VarExprAST* machine, ExprAST* mach_version, VarExprAST* component, string* field_name);
-
-  // method call from specified chip
-  ChipComponentAccessAST(ExprAST* chip_version, VarExprAST* machine, ExprAST* mach_version, VarExprAST* component, string* proc_name, Vector<ExprAST*>* expr_vec_ptr);
-
-  // member access from specified chip
-  ChipComponentAccessAST(ExprAST* chip_version, VarExprAST* machine, ExprAST* mach_version, VarExprAST* component, string* field_name);
-
-  // Destructor
-  ~ChipComponentAccessAST();
-
-  // Public Methods
-  Type* generate(string& code) const;
-  void findResources(Map<Var*, string>& resource_list) const;
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  ChipComponentAccessAST(const ChipComponentAccessAST& obj);
-  ChipComponentAccessAST& operator=(const ChipComponentAccessAST& obj);
-
-  // Data Members (m_ prefix)
-  VarExprAST* m_mach_var_ptr;
-  VarExprAST* m_comp_var_ptr;
-  ExprAST* m_mach_ver_expr_ptr;
-  ExprAST* m_chip_ver_expr_ptr;
-  Vector<ExprAST*>* m_expr_vec_ptr;
-  string* m_proc_name_ptr;
-  string* m_field_name_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const ChipComponentAccessAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const ChipComponentAccessAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif // ChipComponentAccessAST_H
diff --git a/src/mem/slicc/ast/ChipComponentAccessAST.py b/src/mem/slicc/ast/ChipComponentAccessAST.py
new file mode 100644
index 0000000..841220c
--- /dev/null
+++ b/src/mem/slicc/ast/ChipComponentAccessAST.py
@@ -0,0 +1,161 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+import re
+
+from slicc.ast.ExprAST import ExprAST
+from slicc.symbols import Type
+
+class ChipComponentAccessAST(ExprAST):
+    def __init__(self, slicc, machine, mach_version, component):
+        super(ChipComponentAccessAST, self).__init__(slicc)
+        self.mach_var = machine
+        self.comp_var = component
+        self.mach_ver_expr = mach_version
+
+    def __repr__(self):
+        return "[ChipAccessExpr: %r]" % self.expr_vec
+
+    def generate(self, code):
+        void_type = self.symtab.find("void", Type)
+
+        mname = self.mach_var.name
+        cname = self.comp_var.name
+        var = self.symtab.machine_components[mname][cname]
+
+        vcode = str(var.code)
+
+        if self.chip_ver_expr is not None:
+            # replace self.chip with specified chip
+            gcode = "g_system.getChip(%s)" % self.chip_ver_expr.inline()
+            vcode = re.sub("m_chip", gcode, vcode)
+
+        # replace default "m_version" with the version we really want
+        gcode = "(%s)" % self.mach_ver_expr.inline()
+        vcode = re.sub("m_version", gcode, vcode)
+
+        return_type, gcode = self.generate_access(var)
+        code("($vcode)$gcode")
+        return return_type
+
+class ChipMethodAccessAST(ChipComponentAccessAST):
+    def __init__(self, slicc, chip_version, machine, mach_version, component,
+                 proc_name, expr_vec):
+        s = super(ChipMethodAccessAST, self)
+        s.__init__(slicc, machine, mach_version, component)
+
+        self.chip_ver_expr = chip_version
+        self.expr_vec = expr_vec
+        self.proc_name = proc_name
+
+    def generate_access(self, var):
+        # generate code
+        paramTypes = []
+        gcode = []
+        for expr in self.expr_vec:
+            t,c = expr.generate()
+            paramTypes.append(t)
+            gcode.append(c)
+
+        methodId = var.type.methodId(self.proc_name, paramTypes)
+
+        # Verify that this is a method of the object
+        if not var.type.methodExist(methodId):
+            error("%s: Type '%s' does not have a method '%s'" % \
+                  ("Invalid method call", var.type, methodId))
+
+        expected_size = len(var.type.methodParamType(methodId))
+        if len(self.expr_vec) != expected_size:
+            # Right number of parameters
+            self.error("Wrong number of parameters for function name: " +\
+                       "'%s', expected: %d, actual: %d",
+                       self.proc_name, expected_size, len(self.expr_vec))
+
+        for expr,expected,actual in zip(self.expr_vec,
+                                        var.type.methodParamType(methodId),
+                                        paramTypes):
+            # Check the types of the parameter
+            if actual != expected:
+                expr.error("Type mismatch: expected: %s actual: %s",
+                           expected, actual)
+
+        # method call
+        code = ".%s(%s)" % (self.proc_name, ', '.join(gcode))
+
+        # Return the return type of the method
+        return var.type.methodReturnType(methodId), code
+
+class LocalChipMethodAST(ChipMethodAccessAST):
+    # method call from local chip
+    def __init__(self, slicc, machine, mach_version, component, proc_name,
+                 expr_vec):
+        s = super(LocalChipMethodAST, self)
+        s.__init__(slicc, None, machine, mach_version, component, proc_name,
+                  expr_vec)
+
+class SpecifiedChipMethodAST(ChipMethodAccessAST):
+    # method call from specified chip
+    def __init__(self, slicc, chip_version, machine, mach_version, component,
+                 proc_name, expr_vec):
+        s = super(SpecifiedChipMethodAST, self)
+        s.__init__(slicc, chip_version, machine, mach_version, component,
+                   proc_name, expr_vec)
+
+class ChipMemberAccessAST(ChipComponentAccessAST):
+    # member access from specified chip
+    def __init__(self, chip_version, machine, mach_version, component,
+                 field_name):
+        s = super(ChipMemberAccessAST, self)
+        s.__init__(slicc, machine, mach_version, component)
+
+        self.chip_ver_expr = chip_version
+        self.field_name = field_name
+
+    def generate_access(self, var):
+        # Verify that this is a valid field name for this type
+        if not var.type.dataMemberExist(self.field_name):
+            self.error("Invalid object field: " +\
+                       "Type '%s' does not have data member %s",
+                       var.type, self.field_name)
+
+        code += ").m_%s" % self.field_name
+
+        return var.type.dataMemberType(self.field_name), code
+
+class LocalChipMemberAST(ChipMemberAccessAST):
+    # member access from local chip
+    def __init__(self, slicc, machine, mach_version, component, field_name):
+        s = super(LocalChipMemberAST, self)
+        s.__init__(slicc, None, machine, mach_version, component,  field_name)
+
+class SpecifiedChipMemberAST(ChipMemberAccessAST):
+    # member access from specified chip
+    def __init__(self, chip_version, machine, mach_version, component,
+                 field_name):
+        s = super(SpecifiedChipMemberAST, self)
+        s.__init__(slicc, chip_version, machine, mach_version, component,
+                   field_name)
diff --git a/src/mem/slicc/ast/CopyHeadStatementAST.cc b/src/mem/slicc/ast/CopyHeadStatementAST.cc
deleted file mode 100644
index 8d455eb..0000000
--- a/src/mem/slicc/ast/CopyHeadStatementAST.cc
+++ /dev/null
@@ -1,85 +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/ast/CopyHeadStatementAST.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-#include "mem/slicc/ast/VarExprAST.hh"
-#include "mem/gems_common/util.hh"
-
-CopyHeadStatementAST::CopyHeadStatementAST(VarExprAST* in_queue_ptr,
-                                           VarExprAST* out_queue_ptr,
-                                           PairListAST* pairs_ptr)
-  : StatementAST(pairs_ptr->getPairs())
-{
-  m_in_queue_ptr = in_queue_ptr;
-  m_out_queue_ptr = out_queue_ptr;
-}
-
-CopyHeadStatementAST::~CopyHeadStatementAST()
-{
-  delete m_in_queue_ptr;
-  delete m_out_queue_ptr;
-}
-
-void CopyHeadStatementAST::generate(string& code, Type* return_type_ptr) const
-{
-  m_in_queue_ptr->assertType("InPort");
-  m_out_queue_ptr->assertType("OutPort");
-
-  code += indent_str();
-  code += m_out_queue_ptr->getVar()->getCode() + ".enqueue(" + m_in_queue_ptr->getVar()->getCode() + ".getMsgPtrCopy()";
-
-  if (getPairs().exist("latency")) {
-    code += ", " + getPairs().lookup("latency");
-  } else {
-    code += ", COPY_HEAD_LATENCY";
-  }
-
-  code += ");\n";
-}
-
-void CopyHeadStatementAST::findResources(Map<Var*, string>& resource_list) const
-{
-  Var* var_ptr = m_out_queue_ptr->getVar();
-  int res_count = 0;
-  if (resource_list.exist(var_ptr)) {
-    res_count = atoi((resource_list.lookup(var_ptr)).c_str());
-  }
-  resource_list.add(var_ptr, int_to_string(res_count+1));
-}
-
-void CopyHeadStatementAST::print(ostream& out) const
-{
-  out << "[CopyHeadStatementAst: " << *m_in_queue_ptr << " " << *m_out_queue_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/CopyHeadStatementAST.hh b/src/mem/slicc/ast/CopyHeadStatementAST.hh
deleted file mode 100644
index 53d4791..0000000
--- a/src/mem/slicc/ast/CopyHeadStatementAST.hh
+++ /dev/null
@@ -1,87 +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$
- *
- */
-
-#ifndef COPYHEADSTATEMENTAST_H
-#define COPYHEADTATEMENTAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/StatementAST.hh"
-#include "mem/slicc/ast/StatementListAST.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-#include "mem/slicc/ast/PairListAST.hh"
-
-class VarExprAST;
-class Var;
-
-class CopyHeadStatementAST : public StatementAST {
-public:
-  // Constructors
-  CopyHeadStatementAST(VarExprAST* in_queue_ptr,
-                       VarExprAST* out_queue_ptr,
-                       PairListAST* pairs_ptr);
-
-  // Destructor
-  ~CopyHeadStatementAST();
-
-  // Public Methods
-  void generate(string& code, Type* return_type_ptr) const;
-  void findResources(Map<Var*, string>& resource_list) const;
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  CopyHeadStatementAST(const CopyHeadStatementAST& obj);
-  CopyHeadStatementAST& operator=(const CopyHeadStatementAST& obj);
-
-  // Data Members (m_ prefix)
-  VarExprAST* m_in_queue_ptr;
-  VarExprAST* m_out_queue_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const CopyHeadStatementAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const CopyHeadStatementAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //COPYHEADSTATEMENTAST_H
diff --git a/src/mem/slicc/ast/CopyHeadStatementAST.py b/src/mem/slicc/ast/CopyHeadStatementAST.py
new file mode 100644
index 0000000..ba99709
--- /dev/null
+++ b/src/mem/slicc/ast/CopyHeadStatementAST.py
@@ -0,0 +1,52 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.StatementAST import StatementAST
+
+class CopyHeadStatementAST(StatementAST):
+    def __init__(self, slicc, in_queue, out_queue, pairs):
+        super(CopyHeadStatementAST, self).__init__(slicc, pairs)
+
+        self.in_queue = in_queue
+        self.out_queue_ptr = out_queue
+
+    def __repr__(self):
+        return "[CopyHeadStatementAst: %r %r]" % (self.in_queue,
+                                                  self.out_queue)
+
+    def generate(self, code, return_type):
+        self.in_queue.assertType("InPort")
+        self.out_queue.assertType("OutPort")
+
+        out_code = self.out_queue.var.code
+        in_code = self.in_queue.var.code
+        latency = self.get("latency", "COPY_HEAD_LATENCY")
+        code("$out_code.enqueue($in_code.getMsgPtrCopy(), $latency);")
+
+    def findResources(self, resources):
+        var = self.out_queue.var
+        resources[var] = str(int(resources.get(var, "0")) + 1)
diff --git a/src/mem/slicc/ast/DeclAST.cc b/src/mem/slicc/ast/DeclAST.cc
deleted file mode 100644
index 6ccf9a9..0000000
--- a/src/mem/slicc/ast/DeclAST.cc
+++ /dev/null
@@ -1,39 +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.
- */
-
-/*
- * DeclAST.C
- *
- * Description: See DeclAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/DeclAST.hh"
diff --git a/src/mem/slicc/ast/DeclAST.hh b/src/mem/slicc/ast/DeclAST.hh
deleted file mode 100644
index d9e4555..0000000
--- a/src/mem/slicc/ast/DeclAST.hh
+++ /dev/null
@@ -1,85 +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.
- */
-
-/*
- * DeclAST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef DECLAST_H
-#define DECLAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/AST.hh"
-#include "mem/slicc/ast/PairListAST.hh"
-#include "mem/slicc/symbols/StateMachine.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-
-class DeclAST : public AST {
-public:
-  // Constructors
-  DeclAST(PairListAST* pairs_ptr) : AST(pairs_ptr->getPairs()) {}
-
-  // Destructor
-  virtual ~DeclAST() {}
-
-  // Public Methods
-  virtual void generate() = 0;
-  virtual void findMachines() {};
-
-  // void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  // DeclAST(const DeclAST& obj);
-  // DeclAST& operator=(const DeclAST& obj);
-
-  // Data Members (m_ prefix)
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const DeclAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const DeclAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //DECLAST_H
diff --git a/src/mem/slicc/ast/DeclAST.py b/src/mem/slicc/ast/DeclAST.py
new file mode 100644
index 0000000..2303725
--- /dev/null
+++ b/src/mem/slicc/ast/DeclAST.py
@@ -0,0 +1,38 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.AST import AST
+
+class DeclAST(AST):
+    def __init__(self, slicc, pairs):
+        super(DeclAST, self).__init__(slicc, pairs)
+
+    def files(self, hh, cc, parent=None):
+        pass
+
+    def findMachines(self):
+        return
diff --git a/src/mem/slicc/ast/DeclListAST.cc b/src/mem/slicc/ast/DeclListAST.cc
deleted file mode 100644
index 8337d71..0000000
--- a/src/mem/slicc/ast/DeclListAST.cc
+++ /dev/null
@@ -1,86 +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.
- */
-
-/*
- * DeclListAST.C
- *
- * Description: See DeclListAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/DeclListAST.hh"
-
-DeclListAST::DeclListAST(Vector<DeclAST*>* vec_ptr)
-  : AST()
-{
-  assert(vec_ptr != NULL);
-  m_vec_ptr = vec_ptr;
-}
-
-// Singleton constructor.
-DeclListAST::DeclListAST(DeclAST* Decl_ptr)
-  : AST()
-{
-  assert(Decl_ptr != NULL);
-  m_vec_ptr = new Vector<DeclAST*>;
-  m_vec_ptr->insertAtTop(Decl_ptr);
-}
-
-DeclListAST::~DeclListAST()
-{
-  int size = m_vec_ptr->size();
-  for(int i=0; i<size; i++) {
-    delete (*m_vec_ptr)[i];
-  }
-  delete m_vec_ptr;
-}
-
-void DeclListAST::generate() const
-{
-  int size = m_vec_ptr->size();
-  for(int i=0; i<size; i++) {
-    (*m_vec_ptr)[i]->generate();
-  }
-}
-
-void DeclListAST::findMachines() const
-{
-  int size = m_vec_ptr->size();
-  for(int i=0; i<size; i++) {
-    (*m_vec_ptr)[i]->findMachines();
-  }
-}
-
-void DeclListAST::print(ostream& out) const
-{
-  assert(m_vec_ptr != NULL);
-  out << "[DeclListAST: " << *m_vec_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/DeclListAST.hh b/src/mem/slicc/ast/DeclListAST.hh
deleted file mode 100644
index 1c2bc3c..0000000
--- a/src/mem/slicc/ast/DeclListAST.hh
+++ /dev/null
@@ -1,84 +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.
- */
-
-/*
- * DeclListAST.hh
- *
- * Description:
- *
- * $Id: DeclListAST.hh,v 3.1 2001/12/12 01:00:12 milo Exp $
- *
- */
-
-#ifndef DeclListAST_H
-#define DeclListAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/AST.hh"
-#include "mem/slicc/ast/DeclAST.hh"
-
-class DeclListAST : public AST {
-public:
-  // Constructors
-  DeclListAST(Vector<DeclAST*>* vec_ptr);
-  DeclListAST(DeclAST* statement_ptr);
-
-  // Destructor
-  ~DeclListAST();
-
-  // Public Methods
-  void generate() const;
-  void findMachines() const;
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  DeclListAST(const DeclListAST& obj);
-  DeclListAST& operator=(const DeclListAST& obj);
-
-  // Data Members (m_ prefix)
-  Vector<DeclAST*>* m_vec_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const DeclListAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const DeclListAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //DeclListAST_H
diff --git a/src/mem/slicc/ast/DeclListAST.py b/src/mem/slicc/ast/DeclListAST.py
new file mode 100644
index 0000000..42f98af
--- /dev/null
+++ b/src/mem/slicc/ast/DeclListAST.py
@@ -0,0 +1,51 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.AST import AST
+
+class DeclListAST(AST):
+    def __init__(self, slicc, decls):
+        super(DeclListAST, self).__init__(slicc)
+
+        if not isinstance(decls, (list, tuple)):
+            decls = [ decls ]
+        self.decls = decls
+
+    def __repr__(self):
+        return "[DeclListAST: %s]" % (', '.join(repr(d) for d in self.decls))
+
+    def files(self, hh, cc, parent=None):
+        for decl in self.decls:
+            decl.files(hh, cc, parent)
+
+    def generate(self):
+        for decl in self.decls:
+            decl.generate()
+
+    def findMachines(self):
+        for decl in self.decls:
+            decl.findMachines()
diff --git a/src/mem/slicc/ast/EnqueueStatementAST.cc b/src/mem/slicc/ast/EnqueueStatementAST.cc
deleted file mode 100644
index a422d8a..0000000
--- a/src/mem/slicc/ast/EnqueueStatementAST.cc
+++ /dev/null
@@ -1,111 +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/ast/EnqueueStatementAST.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-#include "mem/slicc/ast/VarExprAST.hh"
-#include "mem/slicc/ast/PairListAST.hh"
-#include "mem/gems_common/util.hh"
-
-EnqueueStatementAST::EnqueueStatementAST(VarExprAST* queue_name_ptr,
-                                         TypeAST* type_name_ptr,
-                                         PairListAST* pairs_ptr,
-                                         StatementListAST* statement_list_ast_ptr)
-  : StatementAST(pairs_ptr->getPairs())
-{
-  m_queue_name_ptr = queue_name_ptr;
-  m_type_name_ptr = type_name_ptr;
-  m_statement_list_ast_ptr = statement_list_ast_ptr;
-}
-
-EnqueueStatementAST::~EnqueueStatementAST()
-{
-  delete m_queue_name_ptr;
-  delete m_type_name_ptr;
-  delete m_statement_list_ast_ptr;
-}
-
-void EnqueueStatementAST::generate(string& code, Type* return_type_ptr) const
-{
-  code += indent_str() + "{\n";  // Start scope
-  inc_indent();
-  g_sym_table.pushFrame();
-
-  Type* msg_type_ptr = m_type_name_ptr->lookupType();
-
-  // Add new local var to symbol table
-  g_sym_table.newSym(new Var("out_msg", getLocation(), msg_type_ptr, "out_msg", getPairs()));
-
-  code += indent_str() + msg_type_ptr->cIdent() + " out_msg;\n";  // Declare message
-  m_statement_list_ast_ptr->generate(code, NULL);                // The other statements
-
-  code += indent_str();
-
-  m_queue_name_ptr->assertType("OutPort");
-  code += "(" + m_queue_name_ptr->getVar()->getCode() + ")";
-  code += ".enqueue(out_msg";
-
-  if (getPairs().exist("latency")) {
-    bool is_number = true;
-    string val = getPairs().lookup("latency");
-    for (int i=0; i<val.size(); i++)
-      if (!isdigit(val[i])) is_number = false;
-    if (is_number)
-      code += ", " + getPairs().lookup("latency");
-    else
-      code += ", m_" + getPairs().lookup("latency");
-  }
-
-  code += ");\n";
-
-  dec_indent();
-  g_sym_table.popFrame();
-  code += indent_str() + "}\n";  // End scope
-}
-
-void EnqueueStatementAST::findResources(Map<Var*, string>& resource_list) const
-{
-  Var* var_ptr = m_queue_name_ptr->getVar();
-  int res_count = 0;
-  if (resource_list.exist(var_ptr)) {
-    res_count = atoi((resource_list.lookup(var_ptr)).c_str());
-  }
-  resource_list.add(var_ptr, int_to_string(res_count+1));
-}
-
-void EnqueueStatementAST::print(ostream& out) const
-{
-  out << "[EnqueueStatementAst: " << *m_queue_name_ptr << " "
-      << m_type_name_ptr->toString() << " " << *m_statement_list_ast_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/EnqueueStatementAST.hh b/src/mem/slicc/ast/EnqueueStatementAST.hh
deleted file mode 100644
index fc2776e..0000000
--- a/src/mem/slicc/ast/EnqueueStatementAST.hh
+++ /dev/null
@@ -1,93 +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.
- */
-
-/*
- * EnqueueStatementAST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef ENQUEUESTATEMENTAST_H
-#define ENQUEUESTATEMENTAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/StatementAST.hh"
-#include "mem/slicc/ast/StatementListAST.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-
-class VarExprAST;
-class Var;
-class PairListAST;
-
-class EnqueueStatementAST : public StatementAST {
-public:
-  // Constructors
-  EnqueueStatementAST(VarExprAST* queue_name_ptr,
-                      TypeAST* type_name_ptr,
-                      PairListAST* pairs_ptr,
-                      StatementListAST* statement_list_ast_ptr);
-
-  // Destructor
-  ~EnqueueStatementAST();
-
-  // Public Methods
-  void generate(string& code, Type* return_type_ptr) const;
-  void findResources(Map<Var*, string>& resource_list) const;
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  EnqueueStatementAST(const EnqueueStatementAST& obj);
-  EnqueueStatementAST& operator=(const EnqueueStatementAST& obj);
-
-  // Data Members (m_ prefix)
-  VarExprAST* m_queue_name_ptr;
-  TypeAST* m_type_name_ptr;
-  StatementListAST* m_statement_list_ast_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const EnqueueStatementAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const EnqueueStatementAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //ENQUEUESTATEMENTAST_H
diff --git a/src/mem/slicc/ast/EnqueueStatementAST.py b/src/mem/slicc/ast/EnqueueStatementAST.py
new file mode 100644
index 0000000..faf9664
--- /dev/null
+++ b/src/mem/slicc/ast/EnqueueStatementAST.py
@@ -0,0 +1,86 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.StatementAST import StatementAST
+from slicc.symbols import Var
+
+class EnqueueStatementAST(StatementAST):
+    def __init__(self, slicc, queue_name, type_ast, pairs, statements):
+        super(EnqueueStatementAST, self).__init__(slicc, pairs)
+
+        self.queue_name = queue_name
+        self.type_ast = type_ast
+        self.statements = statements
+
+    def __repr__(self):
+        return "[EnqueueStatementAst: %s %s %s]" % \
+               (self.queue_name, self.type_ast.ident, self.statements)
+
+    def generate(self, code, return_type):
+        code("{")
+        code.indent()
+        self.symtab.pushFrame()
+
+        msg_type = self.type_ast.type
+
+        # Add new local var to symbol table
+        v = Var(self.symtab, "out_msg", self.location, msg_type, "out_msg",
+                self.pairs)
+        self.symtab.newSymbol(v)
+
+        # Declare message
+        code("${{msg_type.ident}} out_msg;")
+
+        # The other statements
+        t = self.statements.generate(code, None)
+
+        self.queue_name.assertType("OutPort")
+
+        args = [ "out_msg" ]
+        if "latency" in self:
+            latency = self["latency"]
+            try:
+                # see if this is an integer
+                latency = int(latency)
+                args.append("%s" % latency)
+            except ValueError:
+                # if not, it should be a member
+                args.append("m_%s" % latency)
+
+        args = ", ".join(args)
+        code('(${{self.queue_name.var.code}}).enqueue($args);')
+
+
+        # End scope
+        self.symtab.popFrame()
+        code.dedent()
+        code("}")
+
+    def findResources(self, resources):
+        var = self.queue_name.var
+        res_count = int(resources.get(var, 0))
+        resources[var] = str(res_count + 1)
diff --git a/src/mem/slicc/ast/EnumDeclAST.cc b/src/mem/slicc/ast/EnumDeclAST.cc
deleted file mode 100644
index b051f3c..0000000
--- a/src/mem/slicc/ast/EnumDeclAST.cc
+++ /dev/null
@@ -1,98 +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.
- */
-
-/*
- * EnumDeclAST.C
- *
- * Description: See EnumDeclAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/EnumDeclAST.hh"
-#include "mem/slicc/main.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-
-EnumDeclAST::EnumDeclAST(TypeAST* type_ast_ptr,
-                         PairListAST* pairs_ptr,
-                         Vector<TypeFieldAST*>* field_vec_ptr)
-  : DeclAST(pairs_ptr)
-{
-  m_type_ast_ptr = type_ast_ptr;
-  m_field_vec_ptr = field_vec_ptr;
-}
-
-EnumDeclAST::~EnumDeclAST()
-{
-  delete m_type_ast_ptr;
-  if (m_field_vec_ptr != NULL) {
-    int size = m_field_vec_ptr->size();
-    for(int i=0; i<size; i++) {
-      delete (*m_field_vec_ptr)[i];
-    }
-    delete m_field_vec_ptr;
-  }
-}
-
-void EnumDeclAST::generate()
-{
-  string machine_name;
-  string id = m_type_ast_ptr->toString();
-
-  Vector<Type*> param_type_vec;  // used by to_string func call
-
-  // Make the new type
-  Type* new_type_ptr = new Type(id, getLocation(), getPairs(),
-                                g_sym_table.getStateMachine());
-  g_sym_table.newSym(new_type_ptr);
-
-  // Add all of the fields of the type to it
-  if (m_field_vec_ptr != NULL) {
-    int size = m_field_vec_ptr->size();
-    for(int i=0; i<size; i++) {
-      (*m_field_vec_ptr)[i]->generate(new_type_ptr);
-    }
-  }
-
-  // Add the implicit State_to_string method - FIXME, this is a bit dirty
-  param_type_vec.insertAtBottom(new_type_ptr);  // add state to param vector
-  string func_id = new_type_ptr->cIdent()+"_to_string";
-
-  Map<string, string> pairs;
-  pairs.add("external", "yes");
-  Vector<string> string_vec;
-  g_sym_table.newSym(new Func(func_id, getLocation(), g_sym_table.getType("string"), param_type_vec, string_vec, string(""), pairs, NULL));
-}
-
-void EnumDeclAST::print(ostream& out) const
-{
-  out << "[EnumDecl: " << m_type_ast_ptr->toString() << "]";
-}
-
diff --git a/src/mem/slicc/ast/EnumDeclAST.hh b/src/mem/slicc/ast/EnumDeclAST.hh
deleted file mode 100644
index 2af650e..0000000
--- a/src/mem/slicc/ast/EnumDeclAST.hh
+++ /dev/null
@@ -1,86 +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.
- */
-
-/*
- * EnummDeclAST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef EnumDeclAST_H
-#define EnumDeclAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/DeclAST.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-#include "mem/slicc/ast/TypeFieldAST.hh"
-
-class EnumDeclAST : public DeclAST {
-public:
-  // Constructors
-  EnumDeclAST(TypeAST* type_ast_ptr,
-              PairListAST* pairs_ptr,
-              Vector<TypeFieldAST*>* field_vec_ptr);
-
-  // Destructor
-  ~EnumDeclAST();
-
-  // Public Methods
-  virtual void generate();
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  EnumDeclAST(const EnumDeclAST& obj);
-  EnumDeclAST& operator=(const EnumDeclAST& obj);
-
-  // Data Members (m_ prefix)
-  TypeAST* m_type_ast_ptr;
-  Vector<TypeFieldAST*>* m_field_vec_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const EnumDeclAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const EnumDeclAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //EnumDeclAST_H
diff --git a/src/mem/slicc/ast/EnumDeclAST.py b/src/mem/slicc/ast/EnumDeclAST.py
new file mode 100644
index 0000000..c16fc8a
--- /dev/null
+++ b/src/mem/slicc/ast/EnumDeclAST.py
@@ -0,0 +1,71 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.DeclAST import DeclAST
+from slicc.symbols import Func, Type
+
+class EnumDeclAST(DeclAST):
+    def __init__(self, slicc, type_ast, pairs, fields):
+        super(EnumDeclAST, self).__init__(slicc, pairs)
+
+        self.type_ast = type_ast
+        self.fields = fields
+
+    def __repr__(self):
+        return "[EnumDecl: %s]" % (self.type_ast)
+
+    def files(self, hh, cc, parent=None):
+        if "external" in self:
+            return
+
+        if parent:
+            ident = "%s_%s" % (parent, self.type_ast.ident)
+        else:
+            ident = self.type_ast.ident
+        hh.add("%s.hh" % ident)
+        cc.add("%s.cc" % ident)
+
+    def generate(self):
+        ident = str(self.type_ast)
+
+        # Make the new type
+        t = Type(self.symtab, ident, self.location, self.pairs,
+                 self.state_machine)
+        self.symtab.newSymbol(t)
+
+        # Add all of the fields of the type to it
+        for field in self.fields:
+            field.generate(t)
+
+        # Add the implicit State_to_string method - FIXME, this is a bit dirty
+        func_id = "%s_to_string" % t.c_ident
+
+        pairs = { "external" : "yes" }
+        func = Func(self.symtab, func_id, self.location,
+                    self.symtab.find("string", Type), [ t ], [], "",
+                    pairs, None)
+        self.symtab.newSymbol(func)
diff --git a/src/mem/slicc/ast/EnumExprAST.cc b/src/mem/slicc/ast/EnumExprAST.cc
deleted file mode 100644
index 0d8af0e..0000000
--- a/src/mem/slicc/ast/EnumExprAST.cc
+++ /dev/null
@@ -1,76 +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.
- */
-
-/*
- * EnumExprAST.C
- *
- * Description: See EnumExprAST.hh
- *
- * $Id: EnumExprAST.C,v 3.1 2003/07/10 18:08:06 milo Exp $
- *
- */
-
-#include "mem/slicc/ast/EnumExprAST.hh"
-
-EnumExprAST::EnumExprAST(TypeAST* type_ast_ptr,
-                         string* value_ptr)
-  : ExprAST()
-{
-  assert(value_ptr != NULL);
-  assert(type_ast_ptr != NULL);
-  m_type_ast_ptr = type_ast_ptr;
-  m_value_ptr = value_ptr;
-}
-
-EnumExprAST::~EnumExprAST()
-{
-  delete m_type_ast_ptr;
-  delete m_value_ptr;
-}
-
-Type* EnumExprAST::generate(string& code) const
-{
-  Type* type_ptr = m_type_ast_ptr->lookupType();
-  code += type_ptr->cIdent() + "_" + (*m_value_ptr);
-
-  // Make sure the enumeration value exists
-  if (!type_ptr->enumExist(*m_value_ptr)) {
-    error("Type '" + m_type_ast_ptr->toString() + "' does not have enumeration '" + *m_value_ptr + "'");
-  }
-
-  // Return the proper type
-  return type_ptr;
-}
-
-void EnumExprAST::print(ostream& out) const
-{
-  string str;
-  str += m_type_ast_ptr->toString()+":"+(*m_value_ptr);
-  out << "[EnumExpr: " << str << "]";
-}
diff --git a/src/mem/slicc/ast/EnumExprAST.hh b/src/mem/slicc/ast/EnumExprAST.hh
deleted file mode 100644
index 8af1c88..0000000
--- a/src/mem/slicc/ast/EnumExprAST.hh
+++ /dev/null
@@ -1,85 +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.
- */
-
-/*
- * EnumExprAST.hh
- *
- * Description:
- *
- * $Id: EnumExprAST.hh,v 3.2 2003/07/10 18:08:06 milo Exp $
- *
- */
-
-#ifndef EnumExprAST_H
-#define EnumExprAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/ExprAST.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-
-
-class EnumExprAST : public ExprAST {
-public:
-  // Constructors
-  EnumExprAST(TypeAST* type_ast_ptr,
-              string* value_ptr);
-
-  // Destructor
-  ~EnumExprAST();
-
-  // Public Methods
-  Type* generate(string& code) const;
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  EnumExprAST(const EnumExprAST& obj);
-  EnumExprAST& operator=(const EnumExprAST& obj);
-
-  // Data Members (m_ prefix)
-  TypeAST* m_type_ast_ptr;
-  string* m_value_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const EnumExprAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const EnumExprAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //EnumExprAST_H
diff --git a/src/mem/slicc/ast/EnumExprAST.py b/src/mem/slicc/ast/EnumExprAST.py
new file mode 100644
index 0000000..9cb76a8
--- /dev/null
+++ b/src/mem/slicc/ast/EnumExprAST.py
@@ -0,0 +1,53 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.ExprAST import ExprAST
+
+class EnumExprAST(ExprAST):
+    def __init__(self, slicc, type_ast, value):
+        super(EnumExprAST, self).__init__(slicc)
+
+        assert type_ast
+        assert value
+
+        self.type_ast = type_ast
+        self.value = value
+
+    def __repr__(self):
+        return "[EnumExpr: %s:%s]" % (self.type_ast, self.value)
+
+    def generate(self, code):
+        fix = code.nofix()
+        code('${{self.type_ast.type.c_ident}}_${{self.value}}')
+        code.fix(fix)
+
+        # Make sure the enumeration value exists
+        if self.value not in self.type_ast.type.enums:
+            self.error("Type '%s' does not have enumeration '%s'",
+                       self.type_ast, self.value)
+
+        return self.type_ast.type
diff --git a/src/mem/slicc/ast/ExprAST.cc b/src/mem/slicc/ast/ExprAST.cc
deleted file mode 100644
index 3427d4d..0000000
--- a/src/mem/slicc/ast/ExprAST.cc
+++ /dev/null
@@ -1,39 +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.
- */
-
-/*
- * ExprAST.C
- *
- * Description: See ExprAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/ExprAST.hh"
diff --git a/src/mem/slicc/ast/ExprAST.hh b/src/mem/slicc/ast/ExprAST.hh
deleted file mode 100644
index 9566541..0000000
--- a/src/mem/slicc/ast/ExprAST.hh
+++ /dev/null
@@ -1,84 +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.
- */
-
-/*
- * ExprAST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef EXPRAST_H
-#define EXPRAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/AST.hh"
-
-
-class ExprAST : public AST {
-public:
-  // Constructors
-  ExprAST() : AST() { }
-
-  // Destructor
-  virtual ~ExprAST() { }
-
-  // Public Methods
-  virtual Type* generate(string& code) const = 0;
-  virtual void findResources(Map<Var*, string>& resource_list) const {} // The default is no resources
-
-  // void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  // ExprAST(const ExprAST& obj);
-  // ExprAST& operator=(const ExprAST& obj);
-
-  // Data Members (m_ prefix)
-
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const ExprAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const ExprAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //EXPRAST_H
diff --git a/src/mem/slicc/ast/ExprAST.py b/src/mem/slicc/ast/ExprAST.py
new file mode 100644
index 0000000..70a0aa0
--- /dev/null
+++ b/src/mem/slicc/ast/ExprAST.py
@@ -0,0 +1,45 @@
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util import code_formatter
+
+from slicc.ast.AST import AST
+
+class ExprAST(AST):
+    def __init__(self, slicc):
+        super(ExprAST, self).__init__(slicc)
+
+    def findResources(self, resources):
+        # The default is no resources
+        pass
+
+    def inline(self, get_type=False):
+        code = code_formatter(fix_newlines=False)
+        return_type = self.generate(code)
+        if get_type:
+            return return_type, code
+        else:
+            return code
diff --git a/src/mem/slicc/ast/ExprStatementAST.cc b/src/mem/slicc/ast/ExprStatementAST.cc
deleted file mode 100644
index f4bffaa..0000000
--- a/src/mem/slicc/ast/ExprStatementAST.cc
+++ /dev/null
@@ -1,73 +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.
- */
-
-/*
- * ExprStatementAST.C
- *
- * Description: See ExprStatementAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/ExprStatementAST.hh"
-
-ExprStatementAST::ExprStatementAST(ExprAST* expr_ptr)
-  : StatementAST()
-{
-  m_expr_ptr = expr_ptr;
-}
-
-ExprStatementAST::~ExprStatementAST()
-{
-  delete m_expr_ptr;
-}
-
-void ExprStatementAST::generate(string& code, Type* return_type_ptr) const
-{
-  code += indent_str();
-  Type* actual_type_ptr = m_expr_ptr->generate(code);
-  code += ";\n";
-
-  // The return type must be void
-  Type* expected_type_ptr = g_sym_table.getType("void");
-  if (expected_type_ptr != actual_type_ptr) {
-    m_expr_ptr->error("Non-void return must not be ignored, return type is '" + actual_type_ptr->toString() + "'");
-  }
-}
-
-void ExprStatementAST::findResources(Map<Var*, string>& resource_list) const
-{
-  m_expr_ptr->findResources(resource_list);
-}
-
-void ExprStatementAST::print(ostream& out) const
-{
-  out << "[ExprStatementAST: " << *m_expr_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/ExprStatementAST.hh b/src/mem/slicc/ast/ExprStatementAST.hh
deleted file mode 100644
index a47e86a..0000000
--- a/src/mem/slicc/ast/ExprStatementAST.hh
+++ /dev/null
@@ -1,83 +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.
- */
-
-/*
- * ExprStatementAST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef ExprStatementAST_H
-#define ExprStatementAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/StatementAST.hh"
-#include "mem/slicc/ast/ExprAST.hh"
-
-class ExprStatementAST : public StatementAST {
-public:
-  // Constructors
-  ExprStatementAST(ExprAST* expr_ptr);
-
-  // Destructor
-  ~ExprStatementAST();
-
-  // Public Methods
-  void generate(string& code, Type* return_type_ptr) const;
-  void findResources(Map<Var*, string>& resource_list) const;
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  ExprStatementAST(const ExprStatementAST& obj);
-  ExprStatementAST& operator=(const ExprStatementAST& obj);
-
-  // Data Members (m_ prefix)
-  ExprAST* m_expr_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const ExprStatementAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const ExprStatementAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //ExprStatementAST_H
diff --git a/src/mem/slicc/ast/ExprStatementAST.py b/src/mem/slicc/ast/ExprStatementAST.py
new file mode 100644
index 0000000..b16d1d0
--- /dev/null
+++ b/src/mem/slicc/ast/ExprStatementAST.py
@@ -0,0 +1,52 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util import code_formatter
+
+from slicc.ast.StatementAST import StatementAST
+from slicc.symbols import Type
+
+class ExprStatementAST(StatementAST):
+    def __init__(self, slicc, expr):
+        super(ExprStatementAST, self).__init__(slicc)
+        self.expr = expr
+
+    def __repr__(self):
+        return "[ExprStatementAST: %s]" % (self.expr)
+
+    def generate(self, code, return_type):
+        actual_type,rcode = self.expr.inline(True)
+        code("$rcode;")
+
+        # The return type must be void
+        if actual_type != self.symtab.find("void", Type):
+            self.expr.error("Non-void return must not be ignored, " + \
+                            "return type is '%s'", actual_type.ident)
+
+    def findResources(self, resources):
+        self.expr.findResources(resources)
+
diff --git a/src/mem/slicc/ast/FormalParamAST.cc b/src/mem/slicc/ast/FormalParamAST.cc
deleted file mode 100644
index 529811f..0000000
--- a/src/mem/slicc/ast/FormalParamAST.cc
+++ /dev/null
@@ -1,72 +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.
- */
-
-/*
- * FormalParamAST.C
- *
- * Description: See FormalParamAST.hh
- *
- * $Id: FormalParamAST.C,v 3.1 2000/10/05 21:22:20 milo Exp $
- *
- */
-
-#include "mem/slicc/ast/FormalParamAST.hh"
-#include "mem/slicc/ast/StatementAST.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-
-FormalParamAST::~FormalParamAST()
-{
-  delete m_ident_ptr;
-  delete m_type_ast_ptr;
-}
-
-string FormalParamAST::getTypeName() const 
-{ 
-  return m_type_ast_ptr->toString(); 
-}
-
-Type* FormalParamAST::getType() const
-{
-  return m_type_ast_ptr->lookupType();
-}
-
-Type* FormalParamAST::generate(string& code) const
-{
-  string param = "param_" + *m_ident_ptr;
-
-  Type* type_ptr = m_type_ast_ptr->lookupType();
-  code += type_ptr->cIdent();
-  code += " ";
-  code += param;
-
-  // Add to symbol table
-  g_sym_table.newSym(new Var(*m_ident_ptr, getLocation(), type_ptr, param, getPairs()));
-  return type_ptr;
-}
diff --git a/src/mem/slicc/ast/FormalParamAST.hh b/src/mem/slicc/ast/FormalParamAST.hh
deleted file mode 100644
index ca27948..0000000
--- a/src/mem/slicc/ast/FormalParamAST.hh
+++ /dev/null
@@ -1,88 +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.
- */
-
-/*
- * FormalParamAST.hh
- *
- * Description:
- *
- * $Id: FormalParamAST.hh,v 3.1 2001/12/12 01:00:15 milo Exp $
- *
- */
-
-#ifndef FORMALPARAMAST_H
-#define FORMALPARAMAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/AST.hh"
-
-class TypeAST;
-
-
-class FormalParamAST : public AST {
-public:
-  // Constructors
-  FormalParamAST(TypeAST* type_ast_ptr, string* ident_ptr) : AST() { m_type_ast_ptr = type_ast_ptr; m_ident_ptr = ident_ptr; }
-
-  // Destructor
-  ~FormalParamAST();
-
-  // Public Methods
-  Type* generate(string& code) const;
-  void print(ostream& out) const { out << "[FormalParamAST: " << *m_ident_ptr << "]"; }
-  string getName() const { return *m_ident_ptr; }
-  string getTypeName() const;
-  Type* getType() const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  FormalParamAST(const FormalParamAST& obj);
-  FormalParamAST& operator=(const FormalParamAST& obj);
-
-  // Data Members (m_ prefix)
-  string* m_ident_ptr;
-  TypeAST* m_type_ast_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const FormalParamAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const FormalParamAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //FORMALPARAMAST_H
diff --git a/src/mem/slicc/ast/FormalParamAST.py b/src/mem/slicc/ast/FormalParamAST.py
new file mode 100644
index 0000000..b169cbb
--- /dev/null
+++ b/src/mem/slicc/ast/FormalParamAST.py
@@ -0,0 +1,52 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.AST import AST
+from slicc.symbols import Var
+
+class FormalParamAST(AST):
+    def __init__(self, slicc, type_ast, ident):
+        super(FormalParamAST, self).__init__(slicc)
+        self.type_ast = type_ast
+        self.ident = ident
+
+    def __repr__(self):
+        return "[FormalParamAST: %s]" % self.ident
+
+    @property
+    def name(self):
+        return self.ident
+
+    def generate(self):
+        type = self.type_ast.type
+        param = "param_%s" % self.ident
+
+        # Add to symbol table
+        v = Var(self.symtab, self.ident, self.location, type, param,
+                self.pairs)
+        self.symtab.newSymbol(v)
+        return type, "%s %s" % (type.c_ident, param)
diff --git a/src/mem/slicc/ast/FuncCallExprAST.cc b/src/mem/slicc/ast/FuncCallExprAST.cc
deleted file mode 100644
index 5b19017..0000000
--- a/src/mem/slicc/ast/FuncCallExprAST.cc
+++ /dev/null
@@ -1,224 +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.
- */
-
-/*
- * FuncCallExprAST.C
- *
- * Description: See FuncCallExprAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/FuncCallExprAST.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-
-FuncCallExprAST::FuncCallExprAST(string* proc_name_ptr,
-                                 Vector<ExprAST*>* expr_vec_ptr)
-  : ExprAST()
-{
-  m_proc_name_ptr = proc_name_ptr;
-  m_expr_vec_ptr = expr_vec_ptr;
-}
-
-FuncCallExprAST::~FuncCallExprAST()
-{
-  delete m_proc_name_ptr;
-  int size = m_expr_vec_ptr->size();
-  for(int i=0; i<size; i++) {
-    delete (*m_expr_vec_ptr)[i];
-  }
-  delete m_expr_vec_ptr;
-}
-
-Type* FuncCallExprAST::generate(string& code) const
-{
-  // DEBUG_EXPR is strange since it takes parameters of multiple types
-  if (*m_proc_name_ptr == "DEBUG_EXPR") {
-    // FIXME - check for number of parameters
-    code += "DEBUG_SLICC(MedPrio, \"";
-    code += (*m_expr_vec_ptr)[0]->getLocation().toString();
-    code += ": \", ";
-    (*m_expr_vec_ptr)[0]->generate(code);
-    code += ");\n";
-    Type* void_type_ptr = g_sym_table.getType("void");
-    assert(void_type_ptr != NULL);
-    return void_type_ptr;
-  }
-
-  // hack for adding comments to profileTransition
-  if (*m_proc_name_ptr == "APPEND_TRANSITION_COMMENT") {
-    // FIXME - check for number of parameters
-    code += "APPEND_TRANSITION_COMMENT(";
-    //code += (*m_expr_vec_ptr)[0]->getLocation().toString();
-    //code += ": \", ";
-    (*m_expr_vec_ptr)[0]->generate(code);
-    code += ");\n";
-    Type* void_type_ptr = g_sym_table.getType("void");
-    assert(void_type_ptr != NULL);
-    return void_type_ptr;
-  }
-
-  // Look up the function in the symbol table
-  Vector<string> code_vec;
-  Func* func_ptr = g_sym_table.getFunc(*m_proc_name_ptr);
-
-  // Check the types and get the code for the parameters
-  if (func_ptr == NULL) {
-    error("Unrecognized function name: '" + *m_proc_name_ptr + "'");
-  } else {
-    int size = m_expr_vec_ptr->size();
-
-    Vector<Type*> f = func_ptr->getParamTypes();
-
-    if (size != f.size() ) {
-      error("Wrong number of arguments passed to function : '" + *m_proc_name_ptr + "'");
-    }
-    else {
-      for(int i=0; i<size; i++) {
-
-        // Check the types of the parameter
-        string param_code;
-        Type* actual_type_ptr = (*m_expr_vec_ptr)[i]->generate(param_code);
-        Type* expected_type_ptr = func_ptr->getParamTypes()[i];
-        if (actual_type_ptr != expected_type_ptr) {
-          (*m_expr_vec_ptr)[i]->error("Type mismatch: expected: " + expected_type_ptr->toString() +
-                                      " actual: " + actual_type_ptr->toString());
-        }
-        code_vec.insertAtBottom(param_code);
-      }
-    }
-  }
-
-  /* OK, the semantics of "trigger" here is that, ports in the machine have
-   * different priorities. We always check the first port for doable
-   * transitions. If nothing/stalled, we pick one from the next port.
-   *
-   * One thing we have to be careful as the SLICC protocol writter is :
-   * If a port have two or more transitions can be picked from in one cycle,
-   * they must be independent. Otherwise, if transition A and B mean to be
-   * executed in sequential, and A get stalled, transition B can be issued
-   * erroneously. In practice, in most case, there is only one transition
-   * should be executed in one cycle for a given port. So as most of current
-   * protocols.
-   */
-
-  if (*m_proc_name_ptr == "trigger") {
-    code += indent_str() + "{\n";
-    code += indent_str() + "  Address addr = ";
-    code += code_vec[1];
-    code += ";\n";
-    code += indent_str() + "  TransitionResult result = doTransition(";
-    code += code_vec[0];
-    code += ", " + g_sym_table.getStateMachine()->toString() + "_getState(addr), addr";
-    if(CHECK_INVALID_RESOURCE_STALLS) {
-      // FIXME - the current assumption is that in_buffer_rank is declared in the msg buffer peek statement
-      code += ", in_buffer_rank";
-    }
-    code += ");\n";
-    code += indent_str() + "  if (result == TransitionResult_Valid) {\n";
-    code += indent_str() + "    counter++;\n";
-    code += indent_str() + "    continue; // Check the first port again\n";
-    code += indent_str() + "  }\n";
-    code += indent_str() + "  if (result == TransitionResult_ResourceStall) {\n";
-    code += indent_str() + "    g_eventQueue_ptr->scheduleEvent(this, 1);\n";
-    code += indent_str() + "    // Cannot do anything with this transition, go check next doable transition (mostly likely of next port)\n";
-    code += indent_str() + "  }\n";
-    code += indent_str() + "}\n";
-  } else if (*m_proc_name_ptr == "doubleTrigger") {
-    // NOTE:  Use the doubleTrigger call with extreme caution
-    // the key to double trigger is the second event triggered cannot fail becuase the first event cannot be undone
-    assert(code_vec.size() == 4);
-    code += indent_str() + "{\n";
-    code += indent_str() + "  Address addr1 = ";
-    code += code_vec[1];
-    code += ";\n";
-    code += indent_str() + "  TransitionResult result1 = doTransition(";
-    code += code_vec[0];
-    code += ", " + g_sym_table.getStateMachine()->toString() + "_getState(addr1), addr1";
-    if(CHECK_INVALID_RESOURCE_STALLS) {
-      // FIXME - the current assumption is that in_buffer_rank is declared in the msg buffer peek statement
-      code += ", in_buffer_rank";
-    }
-    code += ");\n";
-    code += indent_str() + "  if (result1 == TransitionResult_Valid) {\n";
-    code += indent_str() + "    //this second event cannont fail because the first event already took effect\n";
-    code += indent_str() + "    Address addr2 = ";
-    code += code_vec[3];
-    code += ";\n";
-    code += indent_str() + "    TransitionResult result2 = doTransition(";
-    code += code_vec[2];
-    code += ", " + g_sym_table.getStateMachine()->toString() + "_getState(addr2), addr2";
-    if(CHECK_INVALID_RESOURCE_STALLS) {
-      // FIXME - the current assumption is that in_buffer_rank is declared in the msg buffer peek statement
-      code += ", in_buffer_rank";
-    }
-    code += ");\n";
-    code += indent_str() + "    assert(result2 == TransitionResult_Valid); // ensure the event suceeded\n";
-    code += indent_str() + "    counter++;\n";
-    code += indent_str() + "    continue; // Check the first port again\n";
-    code += indent_str() + "  }\n";
-    code += indent_str() + "  if (result1 == TransitionResult_ResourceStall) {\n";
-    code += indent_str() + "    g_eventQueue_ptr->scheduleEvent(this, 1);\n";
-    code += indent_str() + "    // Cannot do anything with this transition, go check next doable transition (mostly likely of next port)\n";
-    code += indent_str() + "  }\n";
-    code += indent_str() + "}\n";
-  } else if (*m_proc_name_ptr == "error") {
-    code += indent_str() + (*m_expr_vec_ptr)[0]->embedError(code_vec[0]) + "\n";
-  } else if (*m_proc_name_ptr == "assert") {
-    code += indent_str() + "if (ASSERT_FLAG && !(" + code_vec[0] + ")) {\n";
-    code += indent_str() + "  " + (*m_expr_vec_ptr)[0]->embedError("\"assert failure\"") + "\n";
-    code += indent_str() + "}\n";
-  } else if (*m_proc_name_ptr == "continueProcessing") {
-    code += "counter++; continue; // Check the first port again";
-  } else {
-    // Normal function
-    code += "(";
-    // if the func is internal to the chip but not the machine then it can only be
-    // accessed through the chip pointer
-    if (!func_ptr->existPair("external") && !func_ptr->isInternalMachineFunc()) {
-      code += "m_chip_ptr->";
-    }
-    code += func_ptr->cIdent() + "(";
-    int size = code_vec.size();
-    for(int i=0; i<size; i++) {
-      if (i != 0) {
-        code += ", ";
-      }
-      code += code_vec[i];
-    }
-    code += "))";
-  }
-  return func_ptr->getReturnType();
-}
-
-void FuncCallExprAST::print(ostream& out) const
-{
-  out << "[FuncCallExpr: " << *m_proc_name_ptr << " " << *m_expr_vec_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/FuncCallExprAST.hh b/src/mem/slicc/ast/FuncCallExprAST.hh
deleted file mode 100644
index 6c02122..0000000
--- a/src/mem/slicc/ast/FuncCallExprAST.hh
+++ /dev/null
@@ -1,89 +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.
- */
-
-/*
- * FuncCallExprAST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef FUNCCALLEXPRAST_H
-#define FUNCCALLEXPRAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/StatementAST.hh"
-#include "mem/slicc/ast/ExprAST.hh"
-
-
-// ProcGen decl
-class FuncGen;
-
-class FuncCallExprAST : public ExprAST {
-public:
-  // Constructors
-  FuncCallExprAST(string* proc_name_ptr,
-                  Vector<ExprAST*>* expr_vec_ptr);
-
-  // Destructor
-  ~FuncCallExprAST();
-
-  // Public Methods
-  Type* generate(string& code) const;
-  void print(ostream& out) const;
-
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  FuncCallExprAST(const FuncCallExprAST& obj);
-  FuncCallExprAST& operator=(const FuncCallExprAST& obj);
-
-  // Data Members (m_ prefix)
-  string* m_proc_name_ptr;
-  Vector<ExprAST*>* m_expr_vec_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const FuncCallExprAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const FuncCallExprAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //FUNCCALLEXPRAST_H
diff --git a/src/mem/slicc/ast/FuncCallExprAST.py b/src/mem/slicc/ast/FuncCallExprAST.py
new file mode 100644
index 0000000..abf7eec
--- /dev/null
+++ b/src/mem/slicc/ast/FuncCallExprAST.py
@@ -0,0 +1,168 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.ExprAST import ExprAST
+from slicc.symbols import Func, Type
+
+class FuncCallExprAST(ExprAST):
+    def __init__(self, slicc, proc_name, exprs):
+        super(FuncCallExprAST, self).__init__(slicc)
+        self.proc_name = proc_name
+        self.exprs = exprs
+
+    def __repr__(self):
+        return "[FuncCallExpr: %s %s]" % (self.proc_name, self.exprs)
+
+    def generate(self, code):
+        machine = self.state_machine
+
+        # DEBUG_EXPR is strange since it takes parameters of multiple types
+        if self.proc_name == "DEBUG_EXPR":
+            # FIXME - check for number of parameters
+            code('DEBUG_SLICC(MedPrio, "$0: ", $1)',
+                 self.exprs[0].location, self.exprs[0].inline())
+
+            return self.symtab.find("void", Type)
+
+        # hack for adding comments to profileTransition
+        if self.proc_name == "APPEND_TRANSITION_COMMENT":
+            # FIXME - check for number of parameters
+            code("APPEND_TRANSITION_COMMENT($0)", self.exprs[0].inline())
+            return self.symtab.find("void", Type)
+
+        # Look up the function in the symbol table
+        func = self.symtab.find(self.proc_name, Func)
+
+        # Check the types and get the code for the parameters
+        if func is None:
+            self.error("Unrecognized function name: '%s'", self.proc_name)
+
+        if len(self.exprs) != len(func.param_types):
+            self.error("Wrong number of arguments passed to function : '%s'" +\
+                       " Expected %d, got %d", self.proc_name,
+                       len(func.param_types), len(self.exprs))
+
+        cvec = []
+        for expr,expected_type in zip(self.exprs, func.param_types):
+            # Check the types of the parameter
+            actual_type,param_code = expr.inline(True)
+            if actual_type != expected_type:
+                expr.error("Type mismatch: expected: %s actual: %s" % \
+                           (expected_type, actual_type))
+            cvec.append(param_code)
+
+        # OK, the semantics of "trigger" here is that, ports in the
+        # machine have different priorities. We always check the first
+        # port for doable transitions. If nothing/stalled, we pick one
+        # from the next port.
+        #
+        # One thing we have to be careful as the SLICC protocol
+        # writter is : If a port have two or more transitions can be
+        # picked from in one cycle, they must be independent.
+        # Otherwise, if transition A and B mean to be executed in
+        # sequential, and A get stalled, transition B can be issued
+        # erroneously. In practice, in most case, there is only one
+        # transition should be executed in one cycle for a given
+        # port. So as most of current protocols.
+
+        if self.proc_name == "trigger":
+            code('''
+{
+    Address addr = ${{cvec[1]}};
+    TransitionResult result = doTransition(${{cvec[0]}}, ${machine}_getState(addr), addr);
+
+    if (result == TransitionResult_Valid) {
+        counter++;
+        continue; // Check the first port again
+    }
+
+    if (result == TransitionResult_ResourceStall) {
+        g_eventQueue_ptr->scheduleEvent(this, 1);
+
+        // Cannot do anything with this transition, go check next doable transition (mostly likely of next port)
+    }
+}
+''')
+        elif self.proc_name == "doubleTrigger":
+            # NOTE:  Use the doubleTrigger call with extreme caution
+            # the key to double trigger is the second event triggered
+            # cannot fail becuase the first event cannot be undone
+            assert len(cvec) == 4
+            code('''
+{
+    Address addr1 = ${{cvec[1]}};
+    TransitionResult result1 =
+        doTransition(${{cvec[0]}}, ${machine}_getState(addr1), addr1);
+
+    if (result1 == TransitionResult_Valid) {
+        //this second event cannont fail because the first event
+        // already took effect
+        Address addr2 = ${{cvec[3]}};
+        TransitionResult result2 = doTransition(${{cvec[2]}}, ${machine}_getState(addr2), addr2);
+
+        // ensure the event suceeded
+        assert(result2 == TransitionResult_Valid);
+
+        counter++;
+        continue; // Check the first port again
+    }
+
+    if (result1 == TransitionResult_ResourceStall) {
+        g_eventQueue_ptr->scheduleEvent(this, 1);
+        // Cannot do anything with this transition, go check next
+        // doable transition (mostly likely of next port)
+    }
+}
+''')
+        elif self.proc_name == "error":
+            code("$0", self.exprs[0].embedError(cvec[0]))
+        elif self.proc_name == "assert":
+            error = self.exprs[0].embedError('"assert failure"')
+            code('''
+if (ASSERT_FLAG && !(${{cvec[0]}})) {
+    $error
+}
+''')
+
+        elif self.proc_name == "continueProcessing":
+            code("counter++;")
+            code("continue; // Check the first port again")
+        else:
+            # Normal function
+
+            # if the func is internal to the chip but not the machine
+            # then it can only be accessed through the chip pointer
+            internal = ""
+            if "external" not in func and not func.isInternalMachineFunc:
+                internal = "m_chip_ptr->"
+
+            params = ', '.join(str(c) for c in cvec)
+            fix = code.nofix()
+            code('(${internal}${{func.c_ident}}($params))')
+            code.fix(fix)
+
+        return func.return_type
diff --git a/src/mem/slicc/ast/FuncDeclAST.cc b/src/mem/slicc/ast/FuncDeclAST.cc
deleted file mode 100644
index 2a0905f..0000000
--- a/src/mem/slicc/ast/FuncDeclAST.cc
+++ /dev/null
@@ -1,112 +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.
- */
-
-/*
- * FuncDeclAST.C
- *
- * Description: See FuncDeclAST.hh
- *
- * $Id: FuncDeclAST.C,v 3.4 2003/08/22 18:19:34 beckmann Exp $
- *
- */
-
-#include "mem/slicc/ast/FuncDeclAST.hh"
-#include "mem/slicc/ast/FormalParamAST.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-#include "mem/slicc/main.hh"
-
-FuncDeclAST::FuncDeclAST(TypeAST* return_type_ast_ptr,
-                         string* ident_ptr,
-                         Vector<FormalParamAST*>* formal_vec_ptr,
-                         PairListAST* pairs_ptr,
-                         StatementListAST* statement_list_ptr)
-  : DeclAST(pairs_ptr)
-{
-  m_return_type_ast_ptr = return_type_ast_ptr;
-  m_ident_ptr = ident_ptr;
-  m_formal_vec_ptr = formal_vec_ptr;
-  m_statement_list_ptr = statement_list_ptr;
-}
-
-FuncDeclAST::~FuncDeclAST()
-{
-  delete m_return_type_ast_ptr;
-  delete m_ident_ptr;
-
-  int size = m_formal_vec_ptr->size();
-  for(int i=0; i<size; i++) {
-    delete (*m_formal_vec_ptr)[i];
-  }
-  delete m_formal_vec_ptr;
-  delete m_statement_list_ptr;
-}
-
-void FuncDeclAST::generate()
-{
-  Vector<Type*> type_vec;
-  Vector<string> param_vec;
-  Type* void_type_ptr = g_sym_table.getType("void");
-
-  // Generate definition code
-  g_sym_table.pushFrame();
-
-  // Lookup return type
-  Type* return_type_ptr = m_return_type_ast_ptr->lookupType();
-
-  // Generate function header
-  int size = m_formal_vec_ptr->size();
-  for(int i=0; i<size; i++) {
-    // Lookup parameter types
-    string ident;
-    Type* type_ptr = (*m_formal_vec_ptr)[i]->generate(ident);
-    type_vec.insertAtBottom(type_ptr);
-    param_vec.insertAtBottom(ident);
-  }
-
-  string body;
-  if (m_statement_list_ptr == NULL) {
-    getPairs().add("external", "yes");
-  } else {
-    m_statement_list_ptr->generate(body, return_type_ptr);
-  }
-  g_sym_table.popFrame();
-
-  StateMachine* machine_ptr = g_sym_table.getStateMachine();
-  if (machine_ptr != NULL) {
-    machine_ptr->addFunc(new Func(*m_ident_ptr, getLocation(), return_type_ptr, type_vec, param_vec, body, getPairs(), machine_ptr));
-  } else {
-    g_sym_table.newSym(new Func(*m_ident_ptr, getLocation(), return_type_ptr, type_vec, param_vec, body, getPairs(), machine_ptr));
-  }
-
-}
-
-void FuncDeclAST::print(ostream& out) const
-{
-  out << "[FuncDecl: " << *m_ident_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/FuncDeclAST.hh b/src/mem/slicc/ast/FuncDeclAST.hh
deleted file mode 100644
index 205e71a..0000000
--- a/src/mem/slicc/ast/FuncDeclAST.hh
+++ /dev/null
@@ -1,91 +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.
- */
-
-/*
- * FuncDeclAST.hh
- *
- * Description:
- *
- * $Id: FuncDeclAST.hh,v 3.2 2003/07/10 18:08:06 milo Exp $
- *
- */
-
-#ifndef FuncDeclAST_H
-#define FuncDeclAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/DeclAST.hh"
-#include "mem/slicc/ast/TypeFieldAST.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-
-class FormalParamsAST;
-
-class FuncDeclAST : public DeclAST {
-public:
-  // Constructors
-  FuncDeclAST(TypeAST* return_type_ptr,
-              string* ident_ptr,
-              Vector<FormalParamAST*>* formal_vec_ptr,
-              PairListAST* pairs_ptr,
-              StatementListAST* statement_list_ptr);
-  // Destructor
-  ~FuncDeclAST();
-
-  // Public Methods
-  void generate();
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  FuncDeclAST(const FuncDeclAST& obj);
-  FuncDeclAST& operator=(const FuncDeclAST& obj);
-
-  // Data Members (m_ prefix)
-  string* m_ident_ptr;
-  TypeAST* m_return_type_ast_ptr;
-  Vector<FormalParamAST*>* m_formal_vec_ptr;
-  StatementListAST* m_statement_list_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const FuncDeclAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const FuncDeclAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //FuncDeclAST_H
diff --git a/src/mem/slicc/ast/FuncDeclAST.py b/src/mem/slicc/ast/FuncDeclAST.py
new file mode 100644
index 0000000..7ff3bf8
--- /dev/null
+++ b/src/mem/slicc/ast/FuncDeclAST.py
@@ -0,0 +1,88 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util.code_formatter import code_formatter
+
+from slicc.ast.DeclAST import DeclAST
+from slicc.symbols import Func, Type
+
+class FuncDeclAST(DeclAST):
+    def __init__(self, slicc, return_type, ident, formals, pairs, statements):
+        super(FuncDeclAST, self).__init__(slicc, pairs)
+
+        self.return_type = return_type
+        self.ident = ident
+        self.formals = formals
+        self.statements = statements
+
+    def __repr__(self):
+        return "[FuncDecl: %s]" % self.ident
+
+    def files(self, hh, cc, parent=None):
+        if "external" in self or self.statements is None:
+            return
+
+        if parent:
+            ident = "%s_%s" % (parent, self.ident)
+        else:
+            ident = self.ident
+        cc.add("%s.cc" % ident)
+
+    def generate(self):
+        types = []
+        params = []
+        void_type = self.symtab.find("void", Type)
+
+        # Generate definition code
+        self.symtab.pushFrame()
+
+        # Lookup return type
+        return_type = self.return_type.type
+
+        # Generate function header
+        for formal in self.formals:
+            # Lookup parameter types
+            type, ident = formal.generate()
+            types.append(type)
+            params.append(ident)
+
+        body = code_formatter()
+        if self.statements is None:
+            self["external"] = "yes"
+        else:
+            rtype = self.statements.generate(body, return_type)
+
+        self.symtab.popFrame()
+
+        machine = self.state_machine
+        func = Func(self.symtab, self.ident, self.location, return_type,
+                    types, params, str(body), self.pairs, machine)
+
+        if machine is not None:
+            machine.addFunc(func)
+        else:
+            self.symtab.newSymbol(func)
diff --git a/src/mem/slicc/ast/IfStatementAST.cc b/src/mem/slicc/ast/IfStatementAST.cc
deleted file mode 100644
index 40942a5..0000000
--- a/src/mem/slicc/ast/IfStatementAST.cc
+++ /dev/null
@@ -1,98 +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.
- */
-
-/*
- * IfStatementAST.C
- *
- * Description: See IfStatementAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/IfStatementAST.hh"
-
-IfStatementAST::IfStatementAST(ExprAST* cond_ptr,
-                               StatementListAST* then_ptr,
-                               StatementListAST* else_ptr)
-  : StatementAST()
-{
-  assert(cond_ptr != NULL);
-  assert(then_ptr != NULL);
-  m_cond_ptr = cond_ptr;
-  m_then_ptr = then_ptr;
-  m_else_ptr = else_ptr;
-}
-
-IfStatementAST::~IfStatementAST()
-{
-  delete m_cond_ptr;
-  delete m_then_ptr;
-  delete m_else_ptr;
-}
-
-
-void IfStatementAST::generate(string& code, Type* return_type_ptr) const
-{
-  Type* type_ptr;
-
-  // Conditional
-  code += indent_str() + "if (";
-  type_ptr = m_cond_ptr->generate(code);
-  if (type_ptr != g_sym_table.getType("bool")) {
-    m_cond_ptr->error("Condition of if statement must be boolean, type was '" + type_ptr->toString() + "'");
-  }
-  code += ") {\n";
-  // Then part
-  inc_indent();
-  m_then_ptr->generate(code, return_type_ptr);
-  dec_indent();
-  // Else part
-  if (m_else_ptr != NULL) {
-    code += indent_str() + "} else {\n";
-    inc_indent();
-    m_else_ptr->generate(code, return_type_ptr);
-    dec_indent();
-  }
-  code += indent_str() + "}\n";  // End scope
-}
-
-void IfStatementAST::findResources(Map<Var*, string>& resource_list) const
-{
-  // Take a worse case look at both paths
-  m_then_ptr->findResources(resource_list);
-  if (m_else_ptr != NULL) {
-    m_else_ptr->findResources(resource_list);
-  }
-}
-
-void IfStatementAST::print(ostream& out) const
-{
-  out << "[IfStatement: " << *m_cond_ptr << *m_then_ptr << *m_else_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/IfStatementAST.hh b/src/mem/slicc/ast/IfStatementAST.hh
deleted file mode 100644
index 2c16891..0000000
--- a/src/mem/slicc/ast/IfStatementAST.hh
+++ /dev/null
@@ -1,89 +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.
- */
-
-/*
- * IfStatementAST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef IFSTATEMENTAST_H
-#define IFSTATEMENTAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/ExprAST.hh"
-#include "mem/slicc/ast/StatementAST.hh"
-#include "mem/slicc/ast/StatementListAST.hh"
-
-
-class IfStatementAST : public StatementAST {
-public:
-  // Constructors
-  IfStatementAST(ExprAST* cond_ptr,
-                 StatementListAST* then_ptr,
-                 StatementListAST* else_ptr);
-
-  // Destructor
-  ~IfStatementAST();
-
-  // Public Methods
-  void generate(string& code, Type* return_type_ptr) const;
-  void findResources(Map<Var*, string>& resource_list) const;
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  IfStatementAST(const IfStatementAST& obj);
-  IfStatementAST& operator=(const IfStatementAST& obj);
-
-  // Data Members (m_ prefix)
-  ExprAST* m_cond_ptr;
-  StatementListAST* m_then_ptr;
-  StatementListAST* m_else_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const IfStatementAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const IfStatementAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //IFSTATEMENTAST_H
diff --git a/src/mem/slicc/ast/IfStatementAST.py b/src/mem/slicc/ast/IfStatementAST.py
new file mode 100644
index 0000000..788876f
--- /dev/null
+++ b/src/mem/slicc/ast/IfStatementAST.py
@@ -0,0 +1,74 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util import code_formatter
+
+from slicc.ast.StatementAST import StatementAST
+from slicc.symbols import Type
+
+class IfStatementAST(StatementAST):
+    def __init__(self, slicc, cond, then, else_):
+        super(IfStatementAST, self).__init__(slicc)
+
+        assert cond is not None
+        assert then is not None
+
+        self.cond = cond
+        self.then = then
+        self.else_ = else_
+
+    def __repr__(self):
+        return "[IfStatement: %r%r%r]" % (self.cond, self.then, self.else_)
+
+    def generate(self, code, return_type):
+        cond_code = code_formatter()
+        cond_type = self.cond.generate(cond_code)
+
+        if cond_type != self.symtab.find("bool", Type):
+            self.cond.error("Condition of if stmt must be bool, type was '%s'",
+                            ctype)
+
+        # Conditional
+        code.indent()
+        code('if ($cond_code) {')
+        # Then part
+        code.indent()
+        self.then.generate(code, return_type)
+        code.dedent()
+        # Else part
+        if self.else_:
+            code('} else {')
+            code.indent()
+            self.else_.generate(code, return_type)
+            code.dedent()
+        code('}') # End scope
+
+    def findResources(self, resources):
+        # Take a worse case look at both paths
+        self.then.findResources(resources)
+        if self.else_ is not None:
+            self.else_.findResources(resources)
diff --git a/src/mem/slicc/ast/InPortDeclAST.cc b/src/mem/slicc/ast/InPortDeclAST.cc
deleted file mode 100644
index f62af99..0000000
--- a/src/mem/slicc/ast/InPortDeclAST.cc
+++ /dev/null
@@ -1,149 +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.
- */
-
-/*
- * InPortDeclAST.C
- *
- * Description: See InPortDeclAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/InPortDeclAST.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-#include "mem/slicc/symbols/Var.hh"
-
-InPortDeclAST::InPortDeclAST(string* ident_ptr,
-                             TypeAST* msg_type_ptr,
-                             ExprAST* var_expr_ptr,
-                             PairListAST* pairs_ptr,
-                             StatementListAST* statement_list_ptr)
-  : DeclAST(pairs_ptr)
-{
-  m_ident_ptr = ident_ptr;
-  m_msg_type_ptr = msg_type_ptr;
-  m_var_expr_ptr = var_expr_ptr;
-  m_statement_list_ptr = statement_list_ptr;
-  m_queue_type_ptr = new TypeAST(new string("InPort"));
-}
-
-InPortDeclAST::~InPortDeclAST()
-{
-  delete m_ident_ptr;
-  delete m_msg_type_ptr;
-  delete m_var_expr_ptr;
-  delete m_statement_list_ptr;
-  delete m_queue_type_ptr;
-}
-
-void InPortDeclAST::generate()
-{
-  string code;
-  Type* queue_type_ptr = m_var_expr_ptr->generate(code);
-  if (!queue_type_ptr->isInPort()) {
-    error("Inport queues must be of a type that has the 'inport' attribute.  The type '" +
-          queue_type_ptr->toString() + "' does not have this attribute.");
-  }
-
-  Type* type_ptr = m_queue_type_ptr->lookupType();
-  Var* in_port_ptr = new Var(*m_ident_ptr, getLocation(), type_ptr, code, getPairs());
-  g_sym_table.newSym(in_port_ptr);
-
-  g_sym_table.pushFrame();
-  Vector<Type*> param_type_vec;
-
-  // Check for Event
-  type_ptr = g_sym_table.getType("Event");
-  if (type_ptr == NULL) {
-    error("in_port declarations require 'Event' enumeration to be defined");
-  }
-  param_type_vec.insertAtBottom(type_ptr);
-
-  // Check for Address
-  type_ptr = g_sym_table.getType("Address");
-  if (type_ptr == NULL) {
-    error("in_port declarations require 'Address' type to be defined");
-  }
-  param_type_vec.insertAtBottom(type_ptr);
-
-  // Add the trigger method - FIXME, this is a bit dirty
-  Map<string, string> pairs;
-  pairs.add("external", "yes");
-  Vector<string> string_vec;
-  g_sym_table.newSym(new Func("trigger", getLocation(), g_sym_table.getType("void"), param_type_vec, string_vec, string(""), pairs, NULL));
-
-  // Check for Event2
-  type_ptr = g_sym_table.getType("Event");
-  if (type_ptr == NULL) {
-    error("in_port declarations require 'Event' enumeration to be defined");
-  }
-  param_type_vec.insertAtBottom(type_ptr);
-
-  // Check for Address2
-  type_ptr = g_sym_table.getType("Address");
-  if (type_ptr == NULL) {
-    error("in_port declarations require 'Address' type to be defined");
-  }
-  param_type_vec.insertAtBottom(type_ptr);
-
-  // Add the doubleTrigger method - this hack supports tiggering two simulateous events
-  // The key is that the second transistion cannot fail because the first event cannot be undone
-  // therefore you must do some checks before calling double trigger to ensure that won't happen
-  g_sym_table.newSym(new Func("doubleTrigger", getLocation(), g_sym_table.getType("void"), param_type_vec, string_vec, string(""), pairs, NULL));
-
-  // Add the continueProcessing method - this hack supports messages that don't trigger events
-  Vector<Type*> empty_param_type_vec;
-  Vector<string> empty_string_vec;
-  g_sym_table.newSym(new Func("continueProcessing", getLocation(), g_sym_table.getType("void"), empty_param_type_vec, empty_string_vec, string(""), pairs, NULL));
-
-  if (m_statement_list_ptr != NULL) {
-    inc_indent();
-    inc_indent();
-    string code;
-    m_statement_list_ptr->generate(code, NULL);
-    in_port_ptr->addPair("c_code_in_port", code);
-    dec_indent();
-    dec_indent();
-  }
-  g_sym_table.popFrame();
-
-  // Add port to state machine
-  StateMachine* machine_ptr = g_sym_table.getStateMachine();
-  if (machine_ptr == NULL) {
-    error("InPort declaration not part of a machine.");
-  }
-  machine_ptr->addInPort(in_port_ptr);
-}
-
-
-void InPortDeclAST::print(ostream& out) const
-{
-  out << "[InPortDecl: " << *m_ident_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/InPortDeclAST.hh b/src/mem/slicc/ast/InPortDeclAST.hh
deleted file mode 100644
index e6295a6..0000000
--- a/src/mem/slicc/ast/InPortDeclAST.hh
+++ /dev/null
@@ -1,91 +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.
- */
-
-/*
- * InPortDeclAST.hh
- *
- * Description:
- *
- * $Id: InPortDeclAST.hh,v 3.2 2003/07/10 18:08:06 milo Exp $
- *
- */
-
-#ifndef InPortDeclAST_H
-#define InPortDeclAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/DeclAST.hh"
-#include "mem/slicc/ast/StatementListAST.hh"
-#include "mem/slicc/ast/VarExprAST.hh"
-
-class InPortDeclAST : public DeclAST {
-public:
-  // Constructors
-  InPortDeclAST(string* ident_ptr,
-                TypeAST* msg_type_ptr,
-                ExprAST* var_expr_ptr,
-                PairListAST* pairs_ptr,
-                StatementListAST* statement_list_ptr);
-
-  // Destructor
-  ~InPortDeclAST();
-
-  // Public Methods
-  void generate();
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  InPortDeclAST(const InPortDeclAST& obj);
-  InPortDeclAST& operator=(const InPortDeclAST& obj);
-
-  // Data Members (m_ prefix)
-  string* m_ident_ptr;
-  TypeAST* m_msg_type_ptr;
-  ExprAST* m_var_expr_ptr;
-  StatementListAST* m_statement_list_ptr;
-  TypeAST* m_queue_type_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const InPortDeclAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const InPortDeclAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //InPortDeclAST_H
diff --git a/src/mem/slicc/ast/InPortDeclAST.py b/src/mem/slicc/ast/InPortDeclAST.py
new file mode 100644
index 0000000..3dde245
--- /dev/null
+++ b/src/mem/slicc/ast/InPortDeclAST.py
@@ -0,0 +1,130 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util import code_formatter
+
+from slicc.ast.DeclAST import DeclAST
+from slicc.ast.TypeAST import TypeAST
+from slicc.symbols import Func, Type, Var
+
+class InPortDeclAST(DeclAST):
+    def __init__(self, slicc, ident, msg_type, var_expr, pairs, statements):
+        super(InPortDeclAST, self).__init__(slicc, pairs)
+
+        self.ident = ident
+        self.msg_type = msg_type
+        self.var_expr = var_expr
+        self.statements = statements
+        self.queue_type = TypeAST(slicc, "InPort")
+
+    def __repr__(self):
+        return "[InPortDecl: %s]" % self.ident
+
+    def generate(self):
+        symtab = self.symtab
+        void_type = symtab.find("void", Type)
+
+        code = code_formatter()
+        queue_type = self.var_expr.generate(code)
+        if not queue_type.isInPort:
+            self.error("The inport queue's type must have the 'inport' " + \
+                       "attribute.  Type '%s' does not have this attribute.",
+                       queue_type)
+
+        type = self.queue_type.type
+        in_port = Var(self.symtab, self.ident, self.location, type, str(code),
+                      self.pairs)
+        symtab.newSymbol(in_port)
+
+        symtab.pushFrame()
+        param_types = []
+
+        # Check for Event
+        type = symtab.find("Event", Type)
+        if type is None:
+            self.error("in_port decls require 'Event' enumeration defined")
+        param_types.append(type)
+
+        # Check for Address
+        type = symtab.find("Address", Type)
+        if type is None:
+            self.error("in_port decls require 'Address' type to be defined")
+
+        param_types.append(type)
+
+        # Add the trigger method - FIXME, this is a bit dirty
+        pairs = { "external" : "yes" }
+        func = Func(self.symtab, "trigger", self.location, void_type,
+                    param_types, [], "", pairs, None)
+        symtab.newSymbol(func)
+
+        param_types = []
+        # Check for Event2
+        type = symtab.find("Event", Type)
+        if type is None:
+            self.error("in_port decls require 'Event' enumeration")
+
+        param_types.append(type)
+
+        # Check for Address2
+        type = symtab.find("Address", Type)
+        if type is None:
+            self.error("in_port decls require 'Address' type to be defined")
+
+        param_types.append(type)
+
+        # Add the doubleTrigger method - this hack supports tiggering
+        # two simulateous events
+        #
+        # The key is that the second transistion cannot fail because
+        # the first event cannot be undone therefore you must do some
+        # checks before calling double trigger to ensure that won't
+        # happen
+        func = Func(self.symtab, "doubleTrigger", self.location, void_type,
+                    param_types, [], "", pairs, None)
+        symtab.newSymbol(func)
+
+        # Add the continueProcessing method - this hack supports
+        # messages that don't trigger events
+        func = Func(self.symtab, "continueProcessing", self.location,
+                    void_type, [], [], "", pairs, None)
+        symtab.newSymbol(func)
+
+        if self.statements is not None:
+            rcode = code_formatter()
+            rcode.indent()
+            rcode.indent()
+            self.statements.generate(rcode, None)
+            in_port["c_code_in_port"] = str(rcode)
+        symtab.popFrame()
+
+        # Add port to state machine
+        machine = symtab.state_machine
+        if machine is None:
+            self.error("InPort declaration not part of a machine.")
+
+        machine.addInPort(in_port)
diff --git a/src/mem/slicc/ast/InfixOperatorExprAST.cc b/src/mem/slicc/ast/InfixOperatorExprAST.cc
deleted file mode 100644
index 40719fc..0000000
--- a/src/mem/slicc/ast/InfixOperatorExprAST.cc
+++ /dev/null
@@ -1,121 +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.
- */
-
-/*
- * InfixOperatorExprAST.C
- *
- * Description: See InfixOperatorExprAST.hh
- *
- * $Id: InfixOperatorExprAST.C,v 3.2 2004/01/31 20:46:15 milo Exp $
- *
- */
-
-#include "mem/slicc/ast/InfixOperatorExprAST.hh"
-
-InfixOperatorExprAST::InfixOperatorExprAST(ExprAST* left_ptr,
-                                           string* op_ptr,
-                                           ExprAST* right_ptr)
-  : ExprAST()
-{
-  m_left_ptr = left_ptr;
-  m_op_ptr = op_ptr;
-  m_right_ptr = right_ptr;
-}
-
-InfixOperatorExprAST::~InfixOperatorExprAST()
-{
-  delete m_left_ptr;
-  delete m_op_ptr;
-  delete m_right_ptr;
-}
-
-Type* InfixOperatorExprAST::generate(string& code) const
-{
-  code += "(";
-  Type* left_type_ptr = m_left_ptr->generate(code);
-  code += " " + *m_op_ptr + " ";
-  Type* right_type_ptr = m_right_ptr->generate(code);
-  code += ")";
-
-  string inputs, output;
-  // Figure out what the input and output types should be
-  if ((*m_op_ptr == "==" ||
-       *m_op_ptr == "!=")) {
-    output = "bool";
-    if (left_type_ptr != right_type_ptr) {
-      error("Type mismatch: left & right operand of operator '" + *m_op_ptr +
-            "' must be the same type." +
-            "left: '" + left_type_ptr->toString() +
-            "', right: '" + right_type_ptr->toString() + "'");
-    }
-  } else {
-    if ((*m_op_ptr == "&&" ||
-         *m_op_ptr == "||")) {
-      // boolean inputs and output
-      inputs = "bool";
-      output = "bool";
-    } else if ((*m_op_ptr == "==" ||
-                *m_op_ptr == "!=" ||
-                *m_op_ptr == ">=" ||
-                *m_op_ptr == "<=" ||
-                *m_op_ptr == ">" ||
-                *m_op_ptr == "<")) {
-      // Integer inputs, boolean output
-      inputs = "int";
-      output = "bool";
-    } else {
-      // integer inputs and output
-      inputs = "int";
-      output = "int";
-    }
-
-    Type* inputs_type = g_sym_table.getType(inputs);
-
-    if (inputs_type != left_type_ptr) {
-      m_left_ptr->error("Type mismatch: left operand of operator '" + *m_op_ptr +
-                        "' expects input type '" + inputs + "', actual was " + left_type_ptr->toString() + "'");
-    }
-
-    if (inputs_type != right_type_ptr) {
-      m_right_ptr->error("Type mismatch: right operand of operator '" + *m_op_ptr +
-                         "' expects input type '" + inputs + "', actual was '" + right_type_ptr->toString() + "'");
-    }
-  }
-
-  // All is well
-  Type* output_type = g_sym_table.getType(output);
-  return output_type;
-}
-
-
-void InfixOperatorExprAST::print(ostream& out) const
-{
-  out << "[InfixExpr: " << *m_left_ptr
-      << *m_op_ptr << *m_right_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/InfixOperatorExprAST.hh b/src/mem/slicc/ast/InfixOperatorExprAST.hh
deleted file mode 100644
index f97ab88..0000000
--- a/src/mem/slicc/ast/InfixOperatorExprAST.hh
+++ /dev/null
@@ -1,85 +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.
- */
-
-/*
- * InfixOperatorExprAST.hh
- *
- * Description:
- *
- * $Id: InfixOperatorExprAST.hh,v 3.1 2001/12/12 01:00:19 milo Exp $
- *
- */
-
-#ifndef INFIXOPERATOREXPRAST_H
-#define INFIXOPERATOREXPRAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/ExprAST.hh"
-
-
-class InfixOperatorExprAST : public ExprAST {
-public:
-  // Constructors
-  InfixOperatorExprAST(ExprAST* left_ptr, string* op_ptr, ExprAST* right_ptr);
-
-  // Destructor
-  ~InfixOperatorExprAST();
-
-  // Public Methods
-  Type* generate(string& code) const;
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  InfixOperatorExprAST(const InfixOperatorExprAST& obj);
-  InfixOperatorExprAST& operator=(const InfixOperatorExprAST& obj);
-
-  // Data Members (m_ prefix)
-  ExprAST* m_left_ptr;
-  string* m_op_ptr;
-  ExprAST* m_right_ptr;
-
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const InfixOperatorExprAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const InfixOperatorExprAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //INFIXOPERATOREXPRAST_H
diff --git a/src/mem/slicc/ast/InfixOperatorExprAST.py b/src/mem/slicc/ast/InfixOperatorExprAST.py
new file mode 100644
index 0000000..c4fb4a4
--- /dev/null
+++ b/src/mem/slicc/ast/InfixOperatorExprAST.py
@@ -0,0 +1,89 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util import code_formatter
+
+from slicc.ast.ExprAST import ExprAST
+from slicc.symbols import Type
+
+class InfixOperatorExprAST(ExprAST):
+    def __init__(self, slicc, left, op, right):
+        super(InfixOperatorExprAST, self).__init__(slicc)
+
+        self.left = left
+        self.op = op
+        self.right = right
+
+    def __repr__(self):
+        return "[InfixExpr: %r %s %r]" % (self.left, self.op, self.right)
+
+    def generate(self, code):
+        lcode = code_formatter()
+        rcode = code_formatter()
+
+        ltype = self.left.generate(lcode)
+        rtype = self.right.generate(rcode)
+
+        # Figure out what the input and output types should be
+        if self.op in ("==", "!="):
+            output = "bool"
+            if (ltype != rtype):
+                self.error("Type mismatch: left and right operands of " +
+                           "operator '%s' must be the same type. " +
+                           "left: '%s', right: '%s'",
+                           self.op, ltype, rtype)
+        else:
+            if self.op in ("&&", "||"):
+                # boolean inputs and output
+                inputs = "bool"
+                output = "bool"
+            elif self.op in ("==", "!=", ">=", "<=", ">", "<"):
+                # Integer inputs, boolean output
+                inputs = "int"
+                output = "bool"
+            else:
+                # integer inputs and output
+                inputs = "int"
+                output = "int"
+
+            inputs_type = self.symtab.find(inputs, Type)
+
+            if inputs_type != ltype:
+                self.left.error("Type mismatch: left operand of operator " +
+                                "'%s' expects type '%s', actual was '%s'",
+                                self.op, inputs, ltype)
+
+            if inputs_type != rtype:
+                self.right.error("Type mismatch: right operand of operator " +
+                                 "'%s' expects type '%s', actual was '%s'",
+                                 self.op, inputs, rtype)
+
+        # All is well
+        fix = code.nofix()
+        code("($lcode ${{self.op}} $rcode)")
+        code.fix(fix)
+        return self.symtab.find(output, Type)
diff --git a/src/mem/slicc/ast/LiteralExprAST.cc b/src/mem/slicc/ast/LiteralExprAST.cc
deleted file mode 100644
index 4e384a3..0000000
--- a/src/mem/slicc/ast/LiteralExprAST.cc
+++ /dev/null
@@ -1,55 +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.
- */
-
-/*
- * LiteralExprAST.C
- *
- * Description: See LiteralExprAST.hh
- *
- * $Id: LiteralExprAST.C,v 3.1 2002/10/22 21:27:52 milo Exp $
- *
- */
-
-#include "mem/slicc/ast/LiteralExprAST.hh"
-
-Type* LiteralExprAST::generate(string& code) const
-{
-  if (m_type == "string") {
-    code += "(\"" + *m_lit_ptr + "\")";
-  } else {
-    code += "(" + *m_lit_ptr + ")";
-  }
-
-  Type* type_ptr = g_sym_table.getType(m_type);
-  if (type_ptr == NULL) {
-    // Can't find the type
-    error("Internal: can't primitive type '" + m_type + "'");
-  }
-  return type_ptr;
-}
diff --git a/src/mem/slicc/ast/LiteralExprAST.hh b/src/mem/slicc/ast/LiteralExprAST.hh
deleted file mode 100644
index c895fa9..0000000
--- a/src/mem/slicc/ast/LiteralExprAST.hh
+++ /dev/null
@@ -1,83 +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.
- */
-
-/*
- * LiteralExprAST.hh
- *
- * Description:
- *
- * $Id: LiteralExprAST.hh,v 3.1 2001/12/12 01:00:20 milo Exp $
- *
- */
-
-#ifndef LITERALEXPRAST_H
-#define LITERALEXPRAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/ExprAST.hh"
-
-
-class LiteralExprAST : public ExprAST {
-public:
-  // Constructors
-  LiteralExprAST(string* lit_ptr, string type) : ExprAST() { m_lit_ptr = lit_ptr; m_type = type; }
-
-  // Destructor
-  ~LiteralExprAST() { delete m_lit_ptr; }
-
-  // Public Methods
-  Type* generate(string& code) const;
-  void print(ostream& out) const { out << "[Literal: " << *m_lit_ptr << "]"; }
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  LiteralExprAST(const LiteralExprAST& obj);
-  LiteralExprAST& operator=(const LiteralExprAST& obj);
-
-  // Data Members (m_ prefix)
-  string* m_lit_ptr;
-  string m_type;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const LiteralExprAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const LiteralExprAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //LITERALEXPRAST_H
diff --git a/src/mem/slicc/ast/LiteralExprAST.py b/src/mem/slicc/ast/LiteralExprAST.py
new file mode 100644
index 0000000..773e8f3
--- /dev/null
+++ b/src/mem/slicc/ast/LiteralExprAST.py
@@ -0,0 +1,55 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.ExprAST import ExprAST
+from slicc.symbols import Type
+
+class LiteralExprAST(ExprAST):
+    def __init__(self, slicc, literal, type):
+        super(LiteralExprAST, self).__init__(slicc)
+        self.literal = literal
+        self.type = type
+
+    def __repr__(self):
+        return "[Literal: %s]" % self.literal
+
+    def generate(self, code):
+        fix = code.nofix()
+        if self.type == "string":
+            code('("${{self.literal}}")')
+        elif self.type == "bool":
+            code('(${{str(self.literal).lower()}})')
+        else:
+            code('(${{self.literal}})')
+        code.fix(fix)
+
+        type = self.symtab.find(self.type, Type)
+        if type is None:
+            # Can't find the type
+            self.error("Internal: can't primitive type '%s'" % self.type)
+
+        return type
diff --git a/src/mem/slicc/ast/Location.cc b/src/mem/slicc/ast/Location.cc
deleted file mode 100644
index fd224fe..0000000
--- a/src/mem/slicc/ast/Location.cc
+++ /dev/null
@@ -1,87 +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.
- */
-
-/*
- * Location.C
- *
- * Description: See Location.hh
- *
- * $Id: Location.C,v 3.3 2004/05/30 22:19:02 kmoore Exp $
- *
- */
-
-#include "mem/slicc/ast/Location.hh"
-
-int g_line_number = 0;
-string &g_file_name()
-{
-    static string the_string;
-    return the_string;
-}
-
-Location::Location()
-{
-  m_file_name = g_file_name();
-  m_line_number = g_line_number;
-
-  ostringstream sstr;
-  sstr << getLineNumber();
-  m_line_number_str = sstr.str();
-}
-
-void Location::error(string err_msg) const
-{
-  cerr << endl;
-  cerr << toString() << ": Error: " << err_msg << endl;
-  exit(1);
-}
-
-string Location::embedError(string err_msg) const
-{
-  string code;
-  code += "cerr << \"Runtime Error at ";
-  code += toString() + ", Ruby Time: \" << ";
-  code += "g_eventQueue_ptr->getTime() << \": \" << ";
-  code += err_msg;
-  code += " << \", PID: \" << getpid() << endl;\n";
-  code += "char c; cerr << \"press return to continue.\" << endl; cin.get(c); abort();\n";
-
-  return code;
-}
-
-void Location::warning(string err_msg) const
-{
-  cerr << toString() << ": Warning: "
-       << err_msg << endl;
-}
-
-string Location::toString() const
-{
-  return m_file_name + ":" + m_line_number_str;
-}
diff --git a/src/mem/slicc/ast/Location.hh b/src/mem/slicc/ast/Location.hh
deleted file mode 100644
index c9e2041..0000000
--- a/src/mem/slicc/ast/Location.hh
+++ /dev/null
@@ -1,93 +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.
- */
-
-/*
- * Location.hh
- *
- * Description:
- *
- * $Id: Location.hh,v 3.1 2001/12/12 01:00:20 milo Exp $
- *
- */
-
-#ifndef LOCATION_H
-#define LOCATION_H
-
-#include "mem/slicc/slicc_global.hh"
-
-extern int g_line_number;
-extern string &g_file_name();
-
-class Location {
-public:
-  // Constructors
-  Location();
-
-  // Destructor
-  //~Location();
-
-  // Public Methods
-
-  void print(ostream& out) const;
-  void error(string err_msg) const;
-  string embedError(string err_msg) const;
-  void warning(string err_msg) const;
-  string toString() const;
-
-private:
-  // Private Methods
-  const string& getFileName() const { return m_file_name; }
-  int getLineNumber() const { return m_line_number; }
-  string getLineNumberStr() const { return m_line_number_str; }
-
-  // Private copy constructor and assignment operator
-  //Location(const Location& obj);
-  //Location& operator=(const Location& obj);
-
-  // Data Members (m_ prefix)
-  string m_file_name;
-  int m_line_number;
-  string m_line_number_str;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const Location& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const Location& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //LOCATION_H
diff --git a/src/mem/slicc/ast/MachineAST.cc b/src/mem/slicc/ast/MachineAST.cc
deleted file mode 100644
index ae80264..0000000
--- a/src/mem/slicc/ast/MachineAST.cc
+++ /dev/null
@@ -1,99 +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.
- */
-
-/*
- * MachineAST.cc
- *
- * Description: See MachineAST.hh
- *
- * $Id: MachineAST.cc,v 3.1 2003/03/17 01:54:25 xu Exp $
- *
- */
-
-#include "mem/slicc/ast/MachineAST.hh"
-#include "mem/slicc/ast/FormalParamAST.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-
-MachineAST::MachineAST(string* ident_ptr,
-                       PairListAST* pairs_ptr,
-                       Vector<FormalParamAST*>* config_parameters,
-                       DeclListAST* decl_list_ptr)
-
-  : DeclAST(pairs_ptr)
-{
-  m_ident_ptr = ident_ptr;
-  m_pairs_ptr = pairs_ptr;
-  m_config_parameters = config_parameters;
-  m_decl_list_ptr = decl_list_ptr;
-}
-
-MachineAST::~MachineAST()
-{
-  delete m_ident_ptr;
-  delete m_pairs_ptr;
-  delete m_decl_list_ptr;
-}
-
-void MachineAST::generate()
-{
-  StateMachine* machine_ptr;
-
-  // Make a new frame
-  g_sym_table.pushFrame();
-
-  // Create a new machine
-  machine_ptr = new StateMachine(*m_ident_ptr, getLocation(), getPairs(), m_config_parameters);
-  g_sym_table.newCurrentMachine(machine_ptr);
-
-  // Generate code for all the internal decls
-  m_decl_list_ptr->generate();
-
-  // Build the transition table
-  machine_ptr->buildTable();
-
-  // Pop the frame
-  g_sym_table.popFrame();
-}
-
-void MachineAST::findMachines()
-{
-  // Add to MachineType enumeration
-  Type* type_ptr = g_sym_table.getType("MachineType");
-  if (!type_ptr->enumAdd(*m_ident_ptr, m_pairs_ptr->getPairs())) {
-    error("Duplicate machine name: " + type_ptr->toString() + ":" + *m_ident_ptr);
-  }
-
-  // Generate code for all the internal decls
-  m_decl_list_ptr->findMachines();
-}
-
-void MachineAST::print(ostream& out) const
-{
-  out << "[Machine: " << *m_ident_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/MachineAST.hh b/src/mem/slicc/ast/MachineAST.hh
deleted file mode 100644
index 5d1bc2a..0000000
--- a/src/mem/slicc/ast/MachineAST.hh
+++ /dev/null
@@ -1,93 +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.
- */
-
-/*
- * ActionDeclAST.hh
- *
- * Description:
- *
- * $Id: MachineAST.hh,v 3.2 2003/07/10 18:08:06 milo Exp $
- *
- */
-
-#ifndef MachineAST_H
-#define MachineAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/DeclAST.hh"
-#include "mem/slicc/ast/DeclListAST.hh"
-#include "mem/slicc/ast/TypeFieldAST.hh"
-#include "mem/slicc/symbols/StateMachine.hh"
-
-class FormalParamAST;
-
-class MachineAST : public DeclAST {
-public:
-  // Constructors
-  MachineAST(string* ident_ptr,
-             PairListAST* pairs_ptr,
-             Vector<FormalParamAST*>* config_parameters,
-             DeclListAST* decl_list_ptr);
-
-  // Destructor
-  ~MachineAST();
-
-  // Public Methods
-  void print(ostream& out) const;
-  void generate();
-  void findMachines();
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  MachineAST(const MachineAST& obj);
-  MachineAST& operator=(const MachineAST& obj);
-
-  // Data Members (m_ prefix)
-  Vector<FormalParamAST*>* m_config_parameters;
-  string* m_ident_ptr;
-  DeclListAST* m_decl_list_ptr;
-  PairListAST* m_pairs_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const MachineAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const MachineAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //MachineAST_H
diff --git a/src/mem/slicc/ast/MachineAST.py b/src/mem/slicc/ast/MachineAST.py
new file mode 100644
index 0000000..8d48ccb
--- /dev/null
+++ b/src/mem/slicc/ast/MachineAST.py
@@ -0,0 +1,81 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.DeclAST import DeclAST
+from slicc.symbols import StateMachine, Type
+
+class MachineAST(DeclAST):
+    def __init__(self, slicc, ident, pairs_ast, config_parameters, decls):
+        super(MachineAST, self).__init__(slicc, pairs_ast)
+
+        self.ident = ident
+        self.pairs_ast = pairs_ast
+        self.config_parameters = config_parameters
+        self.decls = decls
+
+    def __repr__(self):
+        return "[Machine: %r]" % self.ident
+
+    def files(self, hh, cc, parent=None):
+        hh.add('%s_Controller.hh' % self.ident)
+        hh.add('%s_Profiler.hh' % self.ident)
+
+        cc.add('%s_Controller.cc' % self.ident)
+        cc.add('%s_Profiler.cc' % self.ident)
+        cc.add('%s_Transitions.cc' % self.ident)
+        cc.add('%s_Wakeup.cc' % self.ident)
+
+        self.decls.files(hh, cc, self.ident)
+
+    def generate(self):
+        # Make a new frame
+        self.symtab.pushFrame()
+
+        # Create a new machine
+        machine = StateMachine(self.symtab, self.ident, self.location,
+                               self.pairs, self.config_parameters)
+
+        self.symtab.newCurrentMachine(machine)
+
+        # Generate code for all the internal decls
+        self.decls.generate()
+
+        # Build the transition table
+        machine.buildTable()
+
+        # Pop the frame
+        self.symtab.popFrame()
+
+    def findMachines(self):
+        # Add to MachineType enumeration
+        machine_type = self.symtab.find("MachineType", Type)
+        if not machine_type.enumAdd(self.ident, self.pairs_ast.pairs):
+            self.error("Duplicate machine name: %s:%s" % (machine_type,
+                                                          self.ident))
+
+        # Generate code for all the internal decls
+        self.decls.findMachines()
diff --git a/src/mem/slicc/ast/MemberExprAST.cc b/src/mem/slicc/ast/MemberExprAST.cc
deleted file mode 100644
index 1bcfdc7..0000000
--- a/src/mem/slicc/ast/MemberExprAST.cc
+++ /dev/null
@@ -1,72 +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.
- */
-
-/*
- * FieldExprAST.C
- *
- * Description: See FieldExprAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/MemberExprAST.hh"
-
-MemberExprAST::MemberExprAST(ExprAST* expr_ast_ptr, string* field_ptr)
-  : ExprAST()
-{
-  m_expr_ast_ptr = expr_ast_ptr;
-  m_field_ptr = field_ptr;
-}
-
-MemberExprAST::~MemberExprAST()
-{
-  delete m_expr_ast_ptr;
-  delete m_field_ptr;
-}
-
-Type* MemberExprAST::generate(string& code) const
-{
-  code += "(";
-  Type* type_ptr = m_expr_ast_ptr->generate(code);
-  code += ").m_" + (*m_field_ptr);
-
-  // Verify that this is a valid field name for this type
-  if (!type_ptr->dataMemberExist(*m_field_ptr)) {
-    error("Invalid object field: Type '" + type_ptr->toString() + "' does not have data member " + *m_field_ptr);
-  }
-
-  // Return the type of the field
-  return type_ptr->dataMemberType(*m_field_ptr);
-}
-
-void MemberExprAST::print(ostream& out) const
-{
-  out << "[MemberExprAST: " << *m_expr_ast_ptr << "." << *m_field_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/MemberExprAST.hh b/src/mem/slicc/ast/MemberExprAST.hh
deleted file mode 100644
index 34b6948..0000000
--- a/src/mem/slicc/ast/MemberExprAST.hh
+++ /dev/null
@@ -1,83 +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.
- */
-
-/*
- * MemberExprAST.hh
- *
- * Description:
- *
- * $Id: MemberExprAST.hh,v 3.1 2001/12/12 01:00:21 milo Exp $
- *
- */
-
-#ifndef MemberExprAST_H
-#define MemberExprAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/ExprAST.hh"
-
-
-class MemberExprAST : public ExprAST {
-public:
-  // Constructors
-  MemberExprAST(ExprAST* expr_ast_ptr, string* field_ptr);
-
-  // Destructor
-  ~MemberExprAST();
-
-  // Public Methods
-  Type* generate(string& code) const;
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  MemberExprAST(const MemberExprAST& obj);
-  MemberExprAST& operator=(const MemberExprAST& obj);
-
-  // Data Members (m_ prefix)
-  ExprAST* m_expr_ast_ptr;
-  string* m_field_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const MemberExprAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const MemberExprAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //MemberExprAST_H
diff --git a/src/mem/slicc/ast/MemberExprAST.py b/src/mem/slicc/ast/MemberExprAST.py
new file mode 100644
index 0000000..113bb18
--- /dev/null
+++ b/src/mem/slicc/ast/MemberExprAST.py
@@ -0,0 +1,55 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util import code_formatter
+
+from slicc.ast.ExprAST import ExprAST
+
+class MemberExprAST(ExprAST):
+    def __init__(self, slicc, expr_ast, field):
+        super(MemberExprAST, self).__init__(slicc)
+
+        self.expr_ast = expr_ast
+        self.field = field
+
+    def __repr__(self):
+        return "[MemberExprAST: %r.%r]" % (self.expr_ast, self.field)
+
+    def generate(self, code):
+        return_type, gcode = self.expr_ast.inline(True)
+        fix = code.nofix()
+        code("($gcode).m_${{self.field}}")
+        code.fix(fix)
+
+        # Verify that this is a valid field name for this type
+        if self.field not in return_type.data_members:
+            error("Invalid object field: " +
+                  "Type '%s' does not have data member %s" % \
+                  (return_type, self.field))
+
+        # Return the type of the field
+        return return_type.data_members[self.field].type
diff --git a/src/mem/slicc/ast/MethodCallExprAST.cc b/src/mem/slicc/ast/MethodCallExprAST.cc
deleted file mode 100644
index 1bfe312..0000000
--- a/src/mem/slicc/ast/MethodCallExprAST.cc
+++ /dev/null
@@ -1,160 +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.
- */
-
-/*
- * MethodCallExprAST.cc
- *
- * Description: See MethodCallExprAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/MethodCallExprAST.hh"
-
-MethodCallExprAST::MethodCallExprAST(ExprAST* obj_expr_ptr,
-                                     string* proc_name_ptr,
-                                     Vector<ExprAST*>* expr_vec_ptr)
-  : ExprAST()
-{
-  m_obj_expr_ptr = obj_expr_ptr;
-  m_type_ptr = NULL;
-  m_proc_name_ptr = proc_name_ptr;
-  m_expr_vec_ptr = expr_vec_ptr;
-}
-
-MethodCallExprAST::MethodCallExprAST(TypeAST* type_ptr,
-                                     string* proc_name_ptr,
-                                     Vector<ExprAST*>* expr_vec_ptr)
-  : ExprAST()
-{
-  m_obj_expr_ptr = NULL;
-  m_type_ptr = type_ptr;
-  m_proc_name_ptr = proc_name_ptr;
-  m_expr_vec_ptr = expr_vec_ptr;
-}
-
-MethodCallExprAST::~MethodCallExprAST()
-{
-  delete m_obj_expr_ptr;
-  delete m_type_ptr;
-  delete m_proc_name_ptr;
-  int size = m_expr_vec_ptr->size();
-  for(int i=0; i<size; i++) {
-    delete (*m_expr_vec_ptr)[i];
-  }
-  delete m_expr_vec_ptr;
-}
-
-Type* MethodCallExprAST::generate(string& code) const
-{
-  Type* obj_type_ptr = NULL;
-
-  string methodId;
-  Vector <Type*> paramTypes;
-
-  int actual_size = m_expr_vec_ptr->size();
-  for(int i=0; i<actual_size; i++) {
-    string tmp;
-    Type* actual_type_ptr = (*m_expr_vec_ptr)[i]->generate(tmp);
-    paramTypes.insertAtBottom(actual_type_ptr);
-  }
-
-  if(m_obj_expr_ptr) {
-    // member method call
-    string tmp;
-    obj_type_ptr = m_obj_expr_ptr->generate(tmp);
-    methodId = obj_type_ptr->methodId(*m_proc_name_ptr, paramTypes);
-    if (obj_type_ptr->methodReturnType(methodId)->isInterface())
-      code += "static_cast<" + obj_type_ptr->methodReturnType(methodId)->cIdent() + "&>";
-    code += "((";
-    code += tmp;
-    code += ").";
-  } else if (m_type_ptr) {
-    // class method call
-    code += "(" + m_type_ptr->toString() + "::";
-    obj_type_ptr = m_type_ptr->lookupType();
-    methodId = obj_type_ptr->methodId(*m_proc_name_ptr, paramTypes);
-  } else {
-    // impossible
-    assert(0);
-  }
-
-  // generate code
-  actual_size = m_expr_vec_ptr->size();
-  code += (*m_proc_name_ptr) + "(";
-  for(int i=0; i<actual_size; i++) {
-    if (i != 0) {
-      code += ", ";
-    }
-    // Check the types of the parameter
-    Type* actual_type_ptr = (*m_expr_vec_ptr)[i]->generate(code);
-  }
-  code += "))";
-
-  // Verify that this is a method of the object
-  if (!obj_type_ptr->methodExist(methodId)) {
-    error("Invalid method call: Type '" + obj_type_ptr->toString() + "' does not have a method '" + methodId + "'");
-  }
-
-  int expected_size = obj_type_ptr->methodParamType(methodId).size();
-  if (actual_size != expected_size) {
-    // Right number of parameters
-    ostringstream err;
-    err << "Wrong number of parameters for function name: '" << *m_proc_name_ptr << "'";
-    err << ", expected: ";
-    err << expected_size;
-    err << ", actual: ";
-    err << actual_size;
-    error(err.str());
-  }
-
-  for(int i=0; i<actual_size; i++) {
-    // Check the types of the parameter
-    Type* actual_type_ptr = paramTypes[i];
-    Type* expected_type_ptr = obj_type_ptr->methodParamType(methodId)[i];
-    if (actual_type_ptr != expected_type_ptr) {
-      (*m_expr_vec_ptr)[i]->error("Type mismatch: expected: " + expected_type_ptr->toString() +
-                                  " actual: " + actual_type_ptr->toString());
-    }
-  }
-
-  // Return the return type of the method
-  return obj_type_ptr->methodReturnType(methodId);
-}
-
-void MethodCallExprAST::findResources(Map<Var*, string>& resource_list) const
-{
-
-}
-
-void MethodCallExprAST::print(ostream& out) const
-{
-  out << "[MethodCallExpr: " << *m_proc_name_ptr << *m_obj_expr_ptr << " " << *m_expr_vec_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/MethodCallExprAST.hh b/src/mem/slicc/ast/MethodCallExprAST.hh
deleted file mode 100644
index d248e6b..0000000
--- a/src/mem/slicc/ast/MethodCallExprAST.hh
+++ /dev/null
@@ -1,93 +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.
- */
-
-/*
- * MethodCallExprAST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef MethodCallExprAST_H
-#define MethodCallExprAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/StatementAST.hh"
-#include "mem/slicc/ast/ExprAST.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-
-class MethodCallExprAST : public ExprAST {
-public:
-  // Constructors
-  MethodCallExprAST(ExprAST* m_obj_expr_ptr,
-                    string* proc_name_ptr,
-                    Vector<ExprAST*>* expr_vec_ptr);
-
-  MethodCallExprAST(TypeAST* type_ptr,
-                    string* proc_name_ptr,
-                    Vector<ExprAST*>* expr_vec_ptr);
-
-  // Destructor
-  ~MethodCallExprAST();
-
-  // Public Methods
-  Type* generate(string& code) const;
-  void findResources(Map<Var*, string>& resource_list) const;
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  MethodCallExprAST(const MethodCallExprAST& obj);
-  MethodCallExprAST& operator=(const MethodCallExprAST& obj);
-
-  // Data Members (m_ prefix)
-  ExprAST* m_obj_expr_ptr;
-  TypeAST* m_type_ptr;
-  string* m_proc_name_ptr;
-  Vector<ExprAST*>* m_expr_vec_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const MethodCallExprAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const MethodCallExprAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif // MethodCallExprAST_H
diff --git a/src/mem/slicc/ast/MethodCallExprAST.py b/src/mem/slicc/ast/MethodCallExprAST.py
new file mode 100644
index 0000000..ecfe43c
--- /dev/null
+++ b/src/mem/slicc/ast/MethodCallExprAST.py
@@ -0,0 +1,127 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util import code_formatter
+
+from slicc.ast.ExprAST import ExprAST
+
+class MethodCallExprAST(ExprAST):
+    def __init__(self, slicc, proc_name, expr_ast_vec):
+        super(MethodCallExprAST, self).__init__(slicc)
+        self.proc_name = proc_name
+        self.expr_ast_vec = expr_ast_vec
+
+    def generate(self, code):
+        tmp = code_formatter()
+        paramTypes = []
+        for expr_ast in self.expr_ast_vec:
+            return_type = expr_ast.generate(tmp)
+            paramTypes.append(return_type)
+
+        obj_type, methodId, prefix = self.generate_prefix(paramTypes)
+
+        # generate code
+        params = []
+        for expr_ast in self.expr_ast_vec:
+            return_type,tcode = expr_ast.inline(True)
+            params.append(str(tcode))
+        fix = code.nofix()
+        code("$prefix${{self.proc_name}}(${{', '.join(params)}}))")
+        code.fix(fix)
+
+        # Verify that this is a method of the object
+        if methodId not in obj_type.methods:
+            error("Invalid method call: Type '%s' does not have a method '%s'",
+                  obj_type, methodId)
+
+        if len(self.expr_ast_vec) != \
+               len(obj_type.methods[methodId].param_types):
+            # Right number of parameters
+            error("Wrong number of parameters for function name: '%s', " + \
+                  "expected: , actual: ", proc_name,
+                  len(obj_type.methods[methodId].param_types),
+                  len(self.expr_ast_vec))
+
+        for actual_type, expected_type in \
+                zip(paramTypes, obj_type.methods[methodId].param_types):
+            if actual_type != expected_type:
+                error("Type mismatch: expected: %s actual: %s",
+                       expected_type, actual_type)
+
+        # Return the return type of the method
+        return obj_type.methods[methodId].return_type
+
+    def findResources(self, resources):
+        pass
+
+class MemberMethodCallExprAST(MethodCallExprAST):
+    def __init__(self, slicc, obj_expr_ast, proc_name, expr_ast_vec):
+        s = super(MemberMethodCallExprAST, self)
+        s.__init__(slicc, proc_name, expr_ast_vec)
+
+        self.obj_expr_ast = obj_expr_ast
+
+    def __repr__(self):
+        return "[MethodCallExpr: %r%r %r]" % (self.proc_name,
+                                              self.obj_expr_ast,
+                                              self.expr_ast_vec)
+    def generate_prefix(self, paramTypes):
+        code = code_formatter()
+
+        # member method call
+        obj_type = self.obj_expr_ast.generate(code)
+        methodId = obj_type.methodId(self.proc_name, paramTypes)
+
+        prefix = ""
+        return_type = obj_type.methods[methodId].return_type
+        if return_type.isInterface:
+            prefix = "static_cast<%s &>" % return_type.c_ident
+        prefix = "%s((%s)." % (prefix, code)
+
+        return obj_type, methodId, prefix
+
+
+class ClassMethodCallExprAST(MethodCallExprAST):
+    def __init__(self, slicc, type_ast, proc_name, expr_ast_vec):
+        s = super(ClassMethodCallExprAST, self)
+        s.__init__(slicc, proc_name, expr_ast_vec)
+
+        self.type_ast = type_ast
+
+    def __repr__(self):
+        return "[MethodCallExpr: %r %r]" % (self.proc_name, self.expr_ast_vec)
+
+    def generate_prefix(self, paramTypes):
+
+        # class method call
+        prefix = "(%s::" % self.type_ast
+        obj_type = self.type_ast.type
+        methodId = obj_type.methodId(self.proc_name, paramTypes)
+
+        return obj_type, methodId, prefix
+
+__all__ = [ "MemberMethodCallExprAST", "ClassMethodCallExprAST" ]
diff --git a/src/mem/slicc/ast/NewExprAST.cc b/src/mem/slicc/ast/NewExprAST.cc
deleted file mode 100644
index 95e5719..0000000
--- a/src/mem/slicc/ast/NewExprAST.cc
+++ /dev/null
@@ -1,9 +0,0 @@
-
-#include "mem/slicc/ast/NewExprAST.hh"
-
-Type* NewExprAST::generate(string & code) const
-{
-  Type* type = m_type_ptr->lookupType();
-  code += "new " + type->cIdent();
-  return type;
-}
diff --git a/src/mem/slicc/ast/NewExprAST.hh b/src/mem/slicc/ast/NewExprAST.hh
deleted file mode 100644
index 375f130..0000000
--- a/src/mem/slicc/ast/NewExprAST.hh
+++ /dev/null
@@ -1,20 +0,0 @@
-#ifndef NEWEXPRAST_H
-#define NEWEXPRAST_H
-
-#include "mem/slicc/ast/ExprAST.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-#include "mem/slicc/symbols/Type.hh"
-
-class NewExprAST : public ExprAST
-{
-public:
-  NewExprAST(TypeAST* type_ptr) : ExprAST() { m_type_ptr = type_ptr; }
-  Type* generate(string & code) const;
-  void print(ostream & out) const { out << "[NewExprAST: " << *m_type_ptr << "]"; }
-  string getName() const { return m_type_ptr->toString(); }
-
-private:
-  TypeAST* m_type_ptr;
-};
-
-#endif
diff --git a/src/mem/slicc/ast/NewExprAST.py b/src/mem/slicc/ast/NewExprAST.py
new file mode 100644
index 0000000..a423507
--- /dev/null
+++ b/src/mem/slicc/ast/NewExprAST.py
@@ -0,0 +1,47 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.ExprAST import ExprAST
+
+class NewExprAST(ExprAST):
+    def __init__(self, slicc, type_ast):
+        super(NewExprAST, self).__init__(slicc)
+        self.type_ast = type_ast
+
+    def __repr__(self):
+        return "[NewExprAST: %r]" % self.type_ast
+
+    @property
+    def name(self):
+        return str(self.type_ast)
+
+    def generate(self, code):
+        type = self.type_ast.type
+        fix = code.nofix()
+        code("new ${{type.c_ident}}")
+        code.fix(fix)
+        return type
diff --git a/src/mem/slicc/ast/ObjDeclAST.cc b/src/mem/slicc/ast/ObjDeclAST.cc
deleted file mode 100644
index 3569395..0000000
--- a/src/mem/slicc/ast/ObjDeclAST.cc
+++ /dev/null
@@ -1,137 +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.
- */
-
-/*
- * ObjDeclAST.cc
- *
- * Description: See ObjDeclAST.hh
- *
- * $Id: ObjDeclAST.cc,v 3.13 2004/06/24 15:56:14 beckmann Exp $
- *
- */
-
-#include "mem/slicc/ast/ObjDeclAST.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-#include "mem/slicc/main.hh"
-
-ObjDeclAST::ObjDeclAST(TypeAST* type_ptr,
-                       string* ident_ptr,
-                       PairListAST* pairs_ptr)
-  : DeclAST(pairs_ptr)
-{
-  m_type_ptr = type_ptr;
-  m_ident_ptr = ident_ptr;
-}
-
-ObjDeclAST::~ObjDeclAST()
-{
-  delete m_type_ptr;
-  delete m_ident_ptr;
-}
-
-void ObjDeclAST::generate()
-{
-
-  bool machineComponentSym = false;
-
-  getPairs().add("chip_object", "yes");
-
-  string c_code;
-
-
-  if (getPairs().exist("hack")) {
-    warning("'hack=' is now deprecated");
-  }
-
-  if (getPairs().exist("network")) {
-    if (!getPairs().exist("virtual_network")) {
-      error("Network queues require a 'virtual_network' attribute.");
-    }
-  }
-
-  Type* type_ptr = m_type_ptr->lookupType();
-  if (type_ptr->isBuffer()) {
-    if (!getPairs().exist("ordered")) {
-      error("Buffer object declarations require an 'ordered' attribute.");
-    }
-  }
-
-  if (getPairs().exist("ordered")) {
-    string value = getPairs().lookup("ordered");
-    if (value != "true" && value != "false") {
-      error("The 'ordered' attribute must be 'true' or 'false'.");
-    }
-  }
-
-  if (getPairs().exist("random")) {
-    string value = getPairs().lookup("random");
-    if (value != "true" && value != "false") {
-      error("The 'random' attribute must be 'true' or 'false'.");
-    }
-  }
-
-  string machine;
-  if (g_sym_table.getStateMachine() != NULL) {
-    machine = g_sym_table.getStateMachine()->getIdent() + "_";
-  }
-
-  // FIXME : should all use accessors here to avoid public member variables
-  if (*m_ident_ptr == "id") {
-    c_code = "m_chip_ptr->getID()";
-  } else if (*m_ident_ptr == "version") {
-    c_code = "m_version";
-  } else if (*m_ident_ptr == "machineID") {
-    c_code = "m_machineID";
-  } else {
-    c_code = "(*m_" + machine + *m_ident_ptr + "_ptr)";
-    //    c_code = "(*(m_chip_ptr->m_" + machine + *m_ident_ptr + "_ptr))";
-      //    machineComponentSym = true;
-  }
-
-  Var* v = new Var(*m_ident_ptr, getLocation(), type_ptr, c_code,
-                             getPairs(), g_sym_table.getStateMachine());
-
-  StateMachine* machine_ptr = g_sym_table.getStateMachine();
-  if (machine_ptr != NULL) {
-    machine_ptr->addObj(v);
-  }// else {
-    g_sym_table.newSym(v);
-    //}
-
-  // used to cheat-- that is, access components in other machines
-  if (machineComponentSym) {
-    g_sym_table.newMachComponentSym(v);
-  }
-
-}
-
-void ObjDeclAST::print(ostream& out) const
-{
-  out << "[ObjDecl: " << *m_ident_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/ObjDeclAST.hh b/src/mem/slicc/ast/ObjDeclAST.hh
deleted file mode 100644
index 0b808f4..0000000
--- a/src/mem/slicc/ast/ObjDeclAST.hh
+++ /dev/null
@@ -1,86 +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.
- */
-
-/*
- * ObjDeclAST.hh
- *
- * Description:
- *
- * $Id: ObjDeclAST.hh,v 3.2 2003/07/10 18:08:06 milo Exp $
- *
- */
-
-#ifndef ObjDeclAST_H
-#define ObjDeclAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/DeclAST.hh"
-#include "mem/slicc/ast/TypeFieldAST.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-
-class ObjDeclAST : public DeclAST {
-public:
-  // Constructors
-  ObjDeclAST(TypeAST* type_ptr,
-             string* ident_ptr,
-             PairListAST* pairs_ptr);
-
-  // Destructor
-  ~ObjDeclAST();
-
-  // Public Methods
-  void generate();
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  ObjDeclAST(const ObjDeclAST& obj);
-  ObjDeclAST& operator=(const ObjDeclAST& obj);
-
-  // Data Members (m_ prefix)
-  string* m_ident_ptr;
-  TypeAST* m_type_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const ObjDeclAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const ObjDeclAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //ObjDeclAST_H
diff --git a/src/mem/slicc/ast/ObjDeclAST.py b/src/mem/slicc/ast/ObjDeclAST.py
new file mode 100644
index 0000000..8a967f7
--- /dev/null
+++ b/src/mem/slicc/ast/ObjDeclAST.py
@@ -0,0 +1,94 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.DeclAST import DeclAST
+from slicc.symbols import Var
+
+class ObjDeclAST(DeclAST):
+    def __init__(self, slicc, type_ast, ident, pairs):
+        super(ObjDeclAST, self).__init__(slicc, pairs)
+
+        self.type_ast = type_ast
+        self.ident = ident
+
+    def __repr__(self):
+        return "[ObjDecl: %r]" % self.ident
+
+    def generate(self):
+        machineComponentSym = False
+
+        self["chip_object"] = "yes"
+
+        if "hack" in self:
+            warning("'hack=' is now deprecated")
+
+        if "network" in self and "virtual_network" not in self:
+            self.error("Network queues require a 'virtual_network' attribute")
+
+        type = self.type_ast.type
+        if type.isBuffer and "ordered" not in self:
+            self.error("Buffer object decls require an 'ordered' attribute")
+
+        if "ordered" in self:
+            value = self["ordered"]
+
+            if value not in ("true", "false"):
+                self.error("The 'ordered' attribute is '%s' " + \
+                           "must be 'true' or 'false'.", value)
+
+        if "random" in self:
+            value = self["random"]
+            if value not in ("true", "false"):
+                self.error("The 'random' attribute is '%s' " + \
+                           "must be 'true' or 'false'.", value)
+
+        machine = self.symtab.state_machine
+
+        # FIXME : should all use accessors here to avoid public member
+        # variables
+        if self.ident == "id":
+            c_code = "m_chip_ptr.getID()"
+        elif self.ident == "version":
+            c_code = "m_version"
+        elif self.ident == "machineID":
+            c_code = "m_machineID"
+        elif machine:
+            c_code = "(*m_%s_%s_ptr)" % (machine.ident, self.ident)
+        else:
+            c_code = "(*m_%s_ptr)" % (self.ident)
+
+        v = Var(self.symtab, self.ident, self.location, type, c_code,
+                self.pairs, machine)
+
+        if machine:
+            machine.addObject(v)
+
+        self.symtab.newSymbol(v)
+
+        # used to cheat-- that is, access components in other machines
+        if machineComponentSym:
+            self.symtab.newMachComponentSym(v)
diff --git a/src/mem/slicc/ast/OutPortDeclAST.cc b/src/mem/slicc/ast/OutPortDeclAST.cc
deleted file mode 100644
index 56a377f..0000000
--- a/src/mem/slicc/ast/OutPortDeclAST.cc
+++ /dev/null
@@ -1,79 +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.
- */
-
-/*
- * OutPortDeclAST.C
- *
- * Description: See OutPortDeclAST.hh
- *
- * $Id: OutPortDeclAST.C,v 3.3 2004/02/02 22:37:51 milo Exp $
- *
- */
-
-#include "mem/slicc/ast/OutPortDeclAST.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-
-OutPortDeclAST::OutPortDeclAST(string* ident_ptr,
-                               TypeAST* msg_type_ptr,
-                               ExprAST* var_expr_ptr,
-                               PairListAST* pairs_ptr)
-  : DeclAST(pairs_ptr)
-{
-  m_ident_ptr = ident_ptr;
-  m_msg_type_ptr = msg_type_ptr;
-  m_var_expr_ptr = var_expr_ptr;
-  m_queue_type_ptr = new TypeAST(new string("OutPort"));
-}
-
-OutPortDeclAST::~OutPortDeclAST()
-{
-  delete m_ident_ptr;
-  delete m_msg_type_ptr;
-  delete m_var_expr_ptr;
-  delete m_queue_type_ptr;
-}
-
-void OutPortDeclAST::generate()
-{
-  string code;
-  Type* queue_type_ptr = m_var_expr_ptr->generate(code);
-  if (!queue_type_ptr->isOutPort()) {
-    error("Outport queues must be of a type that has the 'outport' attribute.  The type '" +
-          queue_type_ptr->toString() + "' does not have this attribute.");
-  }
-
-  Type* type_ptr = m_queue_type_ptr->lookupType();
-  g_sym_table.newSym(new Var(*m_ident_ptr, getLocation(), type_ptr, code, getPairs()));
-}
-
-
-void OutPortDeclAST::print(ostream& out) const
-{
-  out << "[OutPortDecl: " << *m_ident_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/OutPortDeclAST.hh b/src/mem/slicc/ast/OutPortDeclAST.hh
deleted file mode 100644
index 0aa0172..0000000
--- a/src/mem/slicc/ast/OutPortDeclAST.hh
+++ /dev/null
@@ -1,89 +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.
- */
-
-/*
- * OutPortDeclAST.hh
- *
- * Description:
- *
- * $Id: OutPortDeclAST.hh,v 3.2 2003/07/10 18:08:06 milo Exp $
- *
- */
-
-#ifndef OutPortDeclAST_H
-#define OutPortDeclAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/DeclAST.hh"
-#include "mem/slicc/ast/StatementListAST.hh"
-#include "mem/slicc/ast/VarExprAST.hh"
-
-class OutPortDeclAST : public DeclAST {
-public:
-  // Constructors
-  OutPortDeclAST(string* ident_ptr,
-                 TypeAST* msg_type_ptr,
-                 ExprAST* var_expr_ptr,
-                 PairListAST* pairs_ptr);
-
-  // Destructor
-  ~OutPortDeclAST();
-
-  // Public Methods
-  void generate();
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  OutPortDeclAST(const OutPortDeclAST& obj);
-  OutPortDeclAST& operator=(const OutPortDeclAST& obj);
-
-  // Data Members (m_ prefix)
-  string* m_ident_ptr;
-  TypeAST* m_msg_type_ptr;
-  TypeAST* m_queue_type_ptr;
-  ExprAST* m_var_expr_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const OutPortDeclAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const OutPortDeclAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //OutPortDeclAST_H
diff --git a/src/mem/slicc/ast/OutPortDeclAST.py b/src/mem/slicc/ast/OutPortDeclAST.py
new file mode 100644
index 0000000..e6ef319
--- /dev/null
+++ b/src/mem/slicc/ast/OutPortDeclAST.py
@@ -0,0 +1,57 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util import code_formatter
+
+from slicc.ast.DeclAST import DeclAST
+from slicc.ast.TypeAST import TypeAST
+from slicc.symbols import Var
+
+class OutPortDeclAST(DeclAST):
+    def __init__(self, slicc, ident, msg_type, var_expr, pairs):
+        super(OutPortDeclAST, self).__init__(slicc, pairs)
+
+        self.ident = ident
+        self.msg_type = msg_type
+        self.var_expr = var_expr
+        self.queue_type = TypeAST(slicc, "OutPort")
+
+    def __repr__(self):
+        return "[OutPortDecl: %r]" % self.ident
+
+    def generate(self):
+        code = code_formatter(newlines=False)
+
+        queue_type = self.var_expr.generate(code)
+        if not queue_type.isOutPort:
+            self.error("The outport queue's type must have the 'outport' " +
+                       "attribute.  Type '%s' does not have this attribute.",
+                       (queue_type))
+
+        var = Var(self.symtab, self.ident, self.location, self.queue_type.type,
+                  str(code), self.pairs)
+        self.symtab.newSymbol(var)
diff --git a/src/mem/slicc/ast/PairAST.cc b/src/mem/slicc/ast/PairAST.cc
deleted file mode 100644
index c42843c..0000000
--- a/src/mem/slicc/ast/PairAST.cc
+++ /dev/null
@@ -1,72 +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.
- */
-
-/*
- * PairAST.C
- *
- * Description: See PairAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/PairAST.hh"
-
-PairAST::PairAST(string* key_ptr, string* value_ptr)
-  : AST()
-{
-  m_key_ptr = key_ptr;
-  m_value_ptr = value_ptr;
-}
-
-PairAST::PairAST(string key, string* value_ptr)
-  : AST()
-{
-  m_key_ptr = new string(key);
-  m_value_ptr = value_ptr;
-}
-
-PairAST::PairAST(string key, string value)
-  : AST()
-{
-  m_key_ptr = new string(key);
-  m_value_ptr = new string(value);
-}
-
-PairAST::~PairAST()
-{
-  delete m_key_ptr;
-  delete m_value_ptr;
-}
-
-void PairAST::print(ostream& out) const
-{
-  out << "[" << *m_key_ptr << "=" << *m_value_ptr << "]" << endl;
-}
-
diff --git a/src/mem/slicc/ast/PairAST.hh b/src/mem/slicc/ast/PairAST.hh
deleted file mode 100644
index d1bb99b..0000000
--- a/src/mem/slicc/ast/PairAST.hh
+++ /dev/null
@@ -1,86 +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.
- */
-
-/*
- * PairAST.hh
- *
- * Description:
- *
- * $Id: PairAST.hh,v 3.1 2001/12/12 01:00:24 milo Exp $
- *
- */
-
-#ifndef PAIRAST_H
-#define PAIRAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/AST.hh"
-
-class PairAST : public AST {
-public:
-  // Constructors
-  PairAST(string* key_ptr, string* value_ptr);
-  PairAST(string key, string* value_ptr);
-  PairAST(string key, string value);
-
-  // Destructor
-  ~PairAST();
-
-  // Public Methods
-  string key() const { return *m_key_ptr; }
-  string value() const { return *m_value_ptr; }
-
-  virtual void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  // PairAST(const PairAST& obj);
-  // PairAST& operator=(const PairAST& obj);
-
-  // Data Members (m_ prefix)
-  string* m_key_ptr;
-  string* m_value_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const PairAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const PairAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //PAIRAST_H
diff --git a/src/mem/slicc/ast/PairAST.py b/src/mem/slicc/ast/PairAST.py
new file mode 100644
index 0000000..347f4d3
--- /dev/null
+++ b/src/mem/slicc/ast/PairAST.py
@@ -0,0 +1,36 @@
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.AST import AST
+
+class PairAST(AST):
+    def __init__(self, slicc, key, value):
+        super(PairAST, self).__init__(slicc)
+        self.key = key
+        self.value = value
+
+    def __repr__(self):
+        return '[%s=%s]' % (self.key, self.value)
diff --git a/src/mem/slicc/ast/PairListAST.cc b/src/mem/slicc/ast/PairListAST.cc
deleted file mode 100644
index 76892d4..0000000
--- a/src/mem/slicc/ast/PairListAST.cc
+++ /dev/null
@@ -1,49 +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.
- */
-
-/*
- * PairListAST.C
- *
- * Description: See PairListAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/PairListAST.hh"
-
-void PairListAST::addPair(PairAST* pair_ptr)
-{
-  getPairs().add(pair_ptr->key(), pair_ptr->value());
-}
-
-void PairListAST::print(ostream& out) const
-{
-  out << "[PairListAST] " << getPairs();
-}
diff --git a/src/mem/slicc/ast/PairListAST.hh b/src/mem/slicc/ast/PairListAST.hh
deleted file mode 100644
index 7edcdc1..0000000
--- a/src/mem/slicc/ast/PairListAST.hh
+++ /dev/null
@@ -1,82 +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.
- */
-
-/*
- * PairListAST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef PairListAST_H
-#define PairListAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/AST.hh"
-#include "mem/slicc/ast/PairAST.hh"
-
-
-class PairListAST : public AST {
-public:
-  // Constructors
-  PairListAST() : AST() {}
-
-  // Destructor
-  //~PairListAST();
-
-  // Public Methods
-  void addPair(PairAST* pair_ptr);
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  PairListAST(const PairListAST& obj);
-  PairListAST& operator=(const PairListAST& obj);
-
-  // Data Members (m_ prefix)
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const PairListAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const PairListAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //PairListAST_H
diff --git a/src/mem/slicc/ast/PairListAST.py b/src/mem/slicc/ast/PairListAST.py
new file mode 100644
index 0000000..6afe3f4
--- /dev/null
+++ b/src/mem/slicc/ast/PairListAST.py
@@ -0,0 +1,37 @@
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.AST import AST
+
+class PairListAST(AST):
+    def __init__(self, slicc):
+        super(PairListAST, self).__init__(slicc)
+
+    def __repr__(self):
+        return "[PairListAST] %r" % self.pairs
+
+    def addPair(self, pair_ast):
+        self[pair_ast.key] = pair_ast.value
diff --git a/src/mem/slicc/ast/PeekStatementAST.cc b/src/mem/slicc/ast/PeekStatementAST.cc
deleted file mode 100644
index 3e92446..0000000
--- a/src/mem/slicc/ast/PeekStatementAST.cc
+++ /dev/null
@@ -1,115 +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.
- */
-
-/*
- * PeekStatementAST.C
- *
- * Description: See PeekStatementAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/PeekStatementAST.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-#include "mem/slicc/ast/StatementListAST.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-#include "mem/slicc/ast/VarExprAST.hh"
-
-PeekStatementAST::PeekStatementAST(VarExprAST* queue_name_ptr,
-                                   TypeAST* type_ptr,
-                                   StatementListAST* statementlist_ptr,
-                                   string method)
-  : StatementAST()
-{
-  m_queue_name_ptr = queue_name_ptr;
-  m_type_ptr = type_ptr;
-  m_statementlist_ptr = statementlist_ptr;
-  m_method = method;
-}
-
-PeekStatementAST::~PeekStatementAST()
-{
-  delete m_queue_name_ptr;
-  delete m_type_ptr;
-  delete m_statementlist_ptr;
-}
-
-void PeekStatementAST::generate(string& code, Type* return_type_ptr) const
-{
-  code += indent_str() + "{\n";  // Start scope
-  inc_indent();
-  g_sym_table.pushFrame();
-
-  Type* msg_type_ptr = m_type_ptr->lookupType();
-
-  // Add new local var to symbol table
-  g_sym_table.newSym(new Var("in_msg", getLocation(), msg_type_ptr, "(*in_msg_ptr)", getPairs()));
-
-  // Check the queue type
-  m_queue_name_ptr->assertType("InPort");
-
-  // Declare the new "in_msg_ptr" variable
-  code += indent_str() + "const " + msg_type_ptr->cIdent() + "* in_msg_ptr;\n";  // Declare message
-  //  code += indent_str() + "in_msg_ptr = static_cast<const ";
-  code += indent_str() + "in_msg_ptr = dynamic_cast<const ";
-  code += msg_type_ptr->cIdent() + "*>(";
-  code += "(" + m_queue_name_ptr->getVar()->getCode() + ")";
-  code += ".";
-  code += m_method;
-  code += "());\n";
-
-  code += indent_str() + "assert(in_msg_ptr != NULL);\n";        // Check the cast result
-
-  if(CHECK_INVALID_RESOURCE_STALLS) {
-    // Declare the "in_buffer_rank" variable
-    code += indent_str() + "int in_buffer_rank = ";  // Declare message
-    code += "(" + m_queue_name_ptr->getVar()->getCode() + ")";
-    code += ".getPriority();\n";
-  }
-
-  m_statementlist_ptr->generate(code, return_type_ptr);                // The other statements
-  dec_indent();
-  g_sym_table.popFrame();
-  code += indent_str() + "}\n";  // End scope
-}
-
-void PeekStatementAST::findResources(Map<Var*, string>& resource_list) const
-{
-  m_statementlist_ptr->findResources(resource_list);
-}
-
-void PeekStatementAST::print(ostream& out) const
-{
-  out << "[PeekStatementAST: " << m_method
-      << " queue_name: " << *m_queue_name_ptr
-      << " type: " << m_type_ptr->toString()
-      << " " << *m_statementlist_ptr
-      << "]";
-}
diff --git a/src/mem/slicc/ast/PeekStatementAST.hh b/src/mem/slicc/ast/PeekStatementAST.hh
deleted file mode 100644
index e8c65ce..0000000
--- a/src/mem/slicc/ast/PeekStatementAST.hh
+++ /dev/null
@@ -1,91 +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.
- */
-
-/*
- * PeekStatementAST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef PEEKSTATEMENTAST_H
-#define PEEKSTATEMENTAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/StatementAST.hh"
-
-class StatementListAST;
-class TypeAST;
-class VarExprAST;
-
-class PeekStatementAST : public StatementAST {
-public:
-  // Constructors
-  PeekStatementAST(VarExprAST* queue_name_ptr,
-                   TypeAST* type_ptr,
-                   StatementListAST* statementlist_ptr,
-                   string method);
-  // Destructor
-  ~PeekStatementAST();
-
-  // Public Methods
-  void generate(string& code, Type* return_type_ptr) const;
-  void findResources(Map<Var*, string>& resource_list) const;
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  PeekStatementAST(const PeekStatementAST& obj);
-  PeekStatementAST& operator=(const PeekStatementAST& obj);
-
-  // Data Members (m_ prefix)
-  VarExprAST* m_queue_name_ptr;
-  TypeAST* m_type_ptr;
-  StatementListAST* m_statementlist_ptr;
-  string m_method;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const PeekStatementAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const PeekStatementAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //PEEKSTATEMENTAST_H
diff --git a/src/mem/slicc/ast/PeekStatementAST.py b/src/mem/slicc/ast/PeekStatementAST.py
new file mode 100644
index 0000000..5186bf0
--- /dev/null
+++ b/src/mem/slicc/ast/PeekStatementAST.py
@@ -0,0 +1,73 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+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)
+
+        self.queue_name = queue_name
+        self.type_ast = type_ast
+        self.statements = statements
+        self.method = method
+
+    def __repr__(self):
+        return "[PeekStatementAST: %r queue_name: %r type: %r %r]" % \
+               (self.method, self.queue_name, self.type_ast, self.statements)
+
+    def generate(self, code, return_type):
+        self.symtab.pushFrame()
+
+        msg_type = self.type_ast.type
+
+        # Add new local var to symbol table
+        var = Var(self.symtab, "in_msg", self.location, msg_type, "(*in_msg_ptr)",
+                  self.pairs)
+        self.symtab.newSymbol(var)
+
+        # Check the queue type
+        self.queue_name.assertType("InPort")
+
+        # Declare the new "in_msg_ptr" variable
+        mtid = msg_type.ident
+        qcode = self.queue_name.var.code
+        code('''
+{
+    const $mtid* in_msg_ptr;
+    in_msg_ptr = dynamic_cast<const $mtid *>(($qcode).${{self.method}}());
+    assert(in_msg_ptr != NULL);
+''')
+
+        # The other statements
+        self.statements.generate(code, return_type)
+        self.symtab.popFrame()
+        code("}")
+
+    def findResources(self, resources):
+        self.statements.findResources(resources)
diff --git a/src/mem/slicc/ast/ReturnStatementAST.cc b/src/mem/slicc/ast/ReturnStatementAST.cc
deleted file mode 100644
index 8ec937c..0000000
--- a/src/mem/slicc/ast/ReturnStatementAST.cc
+++ /dev/null
@@ -1,79 +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.
- */
-
-/*
- * ReturnStatementAST.C
- *
- * Description: See ReturnStatementAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/ReturnStatementAST.hh"
-
-ReturnStatementAST::ReturnStatementAST(ExprAST* expr_ptr)
-  : StatementAST()
-{
-  m_expr_ptr = expr_ptr;
-}
-
-ReturnStatementAST::~ReturnStatementAST()
-{
-  delete m_expr_ptr;
-}
-
-void ReturnStatementAST::generate(string& code, Type* return_type_ptr) const
-{
-  code += indent_str();
-  code += "return ";
-  Type* actual_type_ptr = m_expr_ptr->generate(code);
-  code += ";\n";
-
-  // Is return valid here?
-  if (return_type_ptr == NULL) {
-    error("Invalid 'return' statement");
-  }
-
-  // The return type must match the return_type_ptr
-  if (return_type_ptr != actual_type_ptr) {
-    m_expr_ptr->error("Return type miss-match, expected return type is '" + return_type_ptr->toString() +
-                      "', actual is '" + actual_type_ptr->toString() + "'");
-  }
-}
-
-void ReturnStatementAST::findResources(Map<Var*, string>& resource_list) const
-{
-  m_expr_ptr->findResources(resource_list);
-}
-
-void ReturnStatementAST::print(ostream& out) const
-{
-  out << "[ReturnStatementAST: " << *m_expr_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/ReturnStatementAST.hh b/src/mem/slicc/ast/ReturnStatementAST.hh
deleted file mode 100644
index 1fa1b36..0000000
--- a/src/mem/slicc/ast/ReturnStatementAST.hh
+++ /dev/null
@@ -1,83 +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.
- */
-
-/*
- * ReturnStatementAST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef ReturnStatementAST_H
-#define ReturnStatementAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/StatementAST.hh"
-#include "mem/slicc/ast/ExprAST.hh"
-
-class ReturnStatementAST : public StatementAST {
-public:
-  // Constructors
-  ReturnStatementAST(ExprAST* expr_ptr);
-
-  // Destructor
-  ~ReturnStatementAST();
-
-  // Public Methods
-  void generate(string& code, Type* return_type_ptr) const;
-  void findResources(Map<Var*, string>& resource_list) const;
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  ReturnStatementAST(const ReturnStatementAST& obj);
-  ReturnStatementAST& operator=(const ReturnStatementAST& obj);
-
-  // Data Members (m_ prefix)
-  ExprAST* m_expr_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const ReturnStatementAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const ReturnStatementAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //ReturnStatementAST_H
diff --git a/src/mem/slicc/ast/ReturnStatementAST.py b/src/mem/slicc/ast/ReturnStatementAST.py
new file mode 100644
index 0000000..1d08a72
--- /dev/null
+++ b/src/mem/slicc/ast/ReturnStatementAST.py
@@ -0,0 +1,54 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.StatementAST import StatementAST
+
+class ReturnStatementAST(StatementAST):
+    def __init__(self, slicc, expr_ast):
+        super(ReturnStatementAST, self).__init__(slicc)
+
+        self.expr_ast = expr_ast
+
+    def __repr__(self):
+        return "[ReturnStatementAST: %r]" % self.expr_ast
+
+    def generate(self, code, return_type):
+        actual_type, ecode = self.expr_ast.inline(True)
+        code('return $ecode;')
+
+        # Is return valid here?
+        if return_type is None:
+            error("Invalid 'return' statement")
+
+        # The return type must match
+        if return_type != actual_type:
+            self.expr_ast.error("Return type miss-match, expected return " +
+                                "type is '%s', actual is '%s'",
+                                return_type, actual_type)
+
+    def findResources(self, resources):
+        self.expr_ast.findResources(resources)
diff --git a/src/mem/slicc/ast/StatementAST.cc b/src/mem/slicc/ast/StatementAST.cc
deleted file mode 100644
index 3562772..0000000
--- a/src/mem/slicc/ast/StatementAST.cc
+++ /dev/null
@@ -1,60 +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.
- */
-
-/*
- * StatementAST.C
- *
- * Description: See StatementAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/StatementAST.hh"
-
-static int indentation_depth = 1;
-
-void inc_indent()
-{
-  indentation_depth++;
-}
-
-void dec_indent()
-{
-  indentation_depth--;
-}
-
-string indent_str()
-{
-  string temp;
-  for(int i=0; i<indentation_depth; i++) {
-    temp += "  ";
-  }
-  return temp;
-}
diff --git a/src/mem/slicc/ast/StatementAST.hh b/src/mem/slicc/ast/StatementAST.hh
deleted file mode 100644
index 9946541..0000000
--- a/src/mem/slicc/ast/StatementAST.hh
+++ /dev/null
@@ -1,88 +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.
- */
-
-/*
- * StatementAST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef STATEMENTAST_H
-#define STATEMENTAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/AST.hh"
-
-void inc_indent();
-void dec_indent();
-string indent_str();
-
-class StatementAST : public AST {
-public:
-  // Constructors
-  StatementAST() : AST() {}
-  StatementAST(Map<string, string> pairs) : AST(pairs) {}
-
-  // Destructor
-  //~StatementAST();
-
-  // Public Methods
-  virtual void generate(string& code, Type* return_type_ptr) const = 0;
-  virtual void findResources(Map<Var*, string>& resource_list) const { }
-
-  //void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  //StatementAST(const StatementAST& obj);
-  //StatementAST& operator=(const StatementAST& obj);
-
-  // Data Members (m_ prefix)
-
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const StatementAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const StatementAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //STATEMENTAST_H
diff --git a/src/mem/slicc/ast/StatementAST.py b/src/mem/slicc/ast/StatementAST.py
new file mode 100644
index 0000000..017b2b1
--- /dev/null
+++ b/src/mem/slicc/ast/StatementAST.py
@@ -0,0 +1,34 @@
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.AST import AST
+
+class StatementAST(AST):
+    def __init__(self, slicc, pairs=None):
+        super(StatementAST, self).__init__(slicc, pairs)
+
+    def findResources(self, resources):
+        pass
diff --git a/src/mem/slicc/ast/StatementListAST.cc b/src/mem/slicc/ast/StatementListAST.cc
deleted file mode 100644
index 0f5817f..0000000
--- a/src/mem/slicc/ast/StatementListAST.cc
+++ /dev/null
@@ -1,86 +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.
- */
-
-/*
- * StatementListAST.C
- *
- * Description: See StatementListAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/StatementListAST.hh"
-
-StatementListAST::StatementListAST(Vector<StatementAST*>* vec_ptr)
-  : AST()
-{
-  assert(vec_ptr != NULL);
-  m_vec_ptr = vec_ptr;
-}
-
-// Singleton constructor.
-StatementListAST::StatementListAST(StatementAST* statement_ptr)
-  : AST()
-{
-  assert(statement_ptr != NULL);
-  m_vec_ptr = new Vector<StatementAST*>;
-  m_vec_ptr->insertAtTop(statement_ptr);
-}
-
-StatementListAST::~StatementListAST()
-{
-  int size = m_vec_ptr->size();
-  for(int i=0; i<size; i++) {
-    delete (*m_vec_ptr)[i];
-  }
-  delete m_vec_ptr;
-}
-
-void StatementListAST::generate(string& code, Type* return_type_ptr) const
-{
-  int size = m_vec_ptr->size();
-  for(int i=0; i<size; i++) {
-    (*m_vec_ptr)[i]->generate(code, return_type_ptr);
-  }
-}
-
-void StatementListAST::findResources(Map<Var*, string>& resource_list) const
-{
-  int size = m_vec_ptr->size();
-  for(int i=0; i<size; i++) {
-    (*m_vec_ptr)[i]->findResources(resource_list);
-  }
-}
-
-void StatementListAST::print(ostream& out) const
-{
-  assert(m_vec_ptr != NULL);
-  out << "[StatementListAST: " << *m_vec_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/StatementListAST.hh b/src/mem/slicc/ast/StatementListAST.hh
deleted file mode 100644
index 831e248..0000000
--- a/src/mem/slicc/ast/StatementListAST.hh
+++ /dev/null
@@ -1,85 +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.
- */
-
-/*
- * StatementListAST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef STATEMENTLISTAST_H
-#define STATEMENTLISTAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/AST.hh"
-#include "mem/slicc/ast/StatementAST.hh"
-class Var;
-
-class StatementListAST : public AST {
-public:
-  // Constructors
-  StatementListAST(Vector<StatementAST*>* vec_ptr);
-  StatementListAST(StatementAST* statement_ptr);
-
-  // Destructor
-  ~StatementListAST();
-
-  // Public Methods
-  void generate(string& code, Type* return_type_ptr) const;
-  void findResources(Map<Var*, string>& resource_list) const;
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  StatementListAST(const StatementListAST& obj);
-  StatementListAST& operator=(const StatementListAST& obj);
-
-  // Data Members (m_ prefix)
-  Vector<StatementAST*>* m_vec_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const StatementListAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const StatementListAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //STATEMENTLISTAST_H
diff --git a/src/mem/slicc/ast/StatementListAST.py b/src/mem/slicc/ast/StatementListAST.py
new file mode 100644
index 0000000..1475c5c
--- /dev/null
+++ b/src/mem/slicc/ast/StatementListAST.py
@@ -0,0 +1,46 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.AST import AST
+
+class StatementListAST(AST):
+    def __init__(self, slicc, statements):
+        super(StatementListAST, self).__init__(slicc)
+        if not isinstance(statements, (list, tuple)):
+            statements = [ statements ]
+        self.statements = statements
+
+    def __repr__(self):
+        return "[StatementListAST: %r]" % self.statements
+
+    def generate(self, code, return_type):
+        for statement in self.statements:
+            statement.generate(code, return_type)
+
+    def findResources(self, resources):
+        for statement in self.statements:
+            statement.findResources(resources)
diff --git a/src/mem/slicc/ast/TransitionDeclAST.cc b/src/mem/slicc/ast/TransitionDeclAST.cc
deleted file mode 100644
index 66b7ca1..0000000
--- a/src/mem/slicc/ast/TransitionDeclAST.cc
+++ /dev/null
@@ -1,89 +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.
- */
-
-/*
- * TransitionDeclAST.C
- *
- * Description: See TransitionDeclAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/TransitionDeclAST.hh"
-#include "mem/slicc/symbols/Transition.hh"
-
-TransitionDeclAST::TransitionDeclAST(Vector<string>* state_list_ptr,
-                                     Vector<string>* event_list_ptr,
-                                     string* next_state_ptr,
-                                     PairListAST* pairs_ptr,
-                                     Vector<string>* action_list_ptr)
-  : DeclAST(pairs_ptr)
-{
-  m_state_list_ptr = state_list_ptr;
-  m_event_list_ptr = event_list_ptr;
-  m_next_state_ptr = next_state_ptr;
-  m_action_list_ptr = action_list_ptr;
-}
-
-TransitionDeclAST::~TransitionDeclAST()
-{
-  delete m_state_list_ptr;
-  delete m_event_list_ptr;
-  delete m_next_state_ptr;
-  delete m_action_list_ptr;
-}
-
-void TransitionDeclAST::generate()
-{
-  Vector<string>& states = *m_state_list_ptr;
-  Vector<string>& events = *m_event_list_ptr;
-
-  StateMachine* machine_ptr = g_sym_table.getStateMachine();
-  if (machine_ptr == NULL) {
-    error("Transition declaration not part of a machine.");
-  } else if (m_next_state_ptr == NULL) {
-    for (int i=0; i<states.size(); i++) {
-      for (int j=0; j<events.size(); j++) {
-        machine_ptr->addTransition(new Transition(states[i], events[j], states[i], *m_action_list_ptr, getLocation(), getPairs()));
-      }
-    }
-  } else {
-    for (int i=0; i<states.size(); i++) {
-      for (int j=0; j<events.size(); j++) {
-        machine_ptr->addTransition(new Transition(states[i], events[j], *m_next_state_ptr, *m_action_list_ptr, getLocation(), getPairs()));
-      }
-    }
-  }
-}
-
-void TransitionDeclAST::print(ostream& out) const
-{
-  out << "[TransitionDecl: ]";
-}
diff --git a/src/mem/slicc/ast/TransitionDeclAST.hh b/src/mem/slicc/ast/TransitionDeclAST.hh
deleted file mode 100644
index f07f0a3..0000000
--- a/src/mem/slicc/ast/TransitionDeclAST.hh
+++ /dev/null
@@ -1,89 +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.
- */
-
-/*
- * TransistionDeclAST.hh
- *
- * Description:
- *
- * $Id: TransitionDeclAST.hh,v 3.2 2003/07/10 18:08:07 milo Exp $
- *
- */
-
-#ifndef TransitionDeclAST_H
-#define TransitionDeclAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/DeclAST.hh"
-#include "mem/slicc/ast/StatementListAST.hh"
-
-class TransitionDeclAST : public DeclAST {
-public:
-  // Constructors
-  TransitionDeclAST(Vector<string>* state_list_ptr,
-                    Vector<string>* event_list_ptr,
-                    string* next_state_ptr,
-                    PairListAST* pairs_ptr,
-                    Vector<string>* action_list_ptr);
-
-  // Destructor
-  ~TransitionDeclAST();
-
-  // Public Methods
-  void generate();
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  TransitionDeclAST(const TransitionDeclAST& obj);
-  TransitionDeclAST& operator=(const TransitionDeclAST& obj);
-
-  // Data Members (m_ prefix)
-  Vector<string>* m_state_list_ptr;
-  Vector<string>* m_event_list_ptr;
-  string* m_next_state_ptr;
-  Vector<string>* m_action_list_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const TransitionDeclAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const TransitionDeclAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //TransitionDeclAST_H
diff --git a/src/mem/slicc/ast/TransitionDeclAST.py b/src/mem/slicc/ast/TransitionDeclAST.py
new file mode 100644
index 0000000..ef745fd
--- /dev/null
+++ b/src/mem/slicc/ast/TransitionDeclAST.py
@@ -0,0 +1,54 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.DeclAST import DeclAST
+from slicc.symbols import Transition
+
+class TransitionDeclAST(DeclAST):
+    def __init__(self, slicc, states, events, next_state, pairs, actions):
+        super(TransitionDeclAST, self).__init__(slicc, pairs)
+
+        self.states = states
+        self.events = events
+        self.next_state = next_state
+        self.actions = actions
+
+    def __repr__(self):
+        return "[TransitionDecl: ]"
+
+    def generate(self):
+        machine = self.symtab.state_machine
+
+        if machine is None:
+            self.error("Transition declaration not part of a machine.")
+
+        for state in self.states:
+            next_state = self.next_state or state
+            for event in self.events:
+                t = Transition(self.symtab, machine, state, event, next_state,
+                               self.actions, self.location, self.pairs)
+                machine.addTransition(t)
diff --git a/src/mem/slicc/ast/TypeAST.cc b/src/mem/slicc/ast/TypeAST.cc
deleted file mode 100644
index 7590b4e..0000000
--- a/src/mem/slicc/ast/TypeAST.cc
+++ /dev/null
@@ -1,67 +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.
- */
-
-/*
- * TypeAST.C
- *
- * Description: See TypeAST.hh
- *
- * $Id: TypeAST.C,v 3.1 2003/03/22 15:15:16 xu Exp $
- *
- */
-
-#include "mem/slicc/ast/TypeAST.hh"
-
-TypeAST::TypeAST(string* ident_ptr)
-  : AST()
-{
-  m_ident_ptr = ident_ptr;
-}
-
-TypeAST::~TypeAST()
-{
-  delete m_ident_ptr;
-
-}
-
-string TypeAST::toString() const
-{
-  return *m_ident_ptr;
-}
-
-Type* TypeAST::lookupType() const
-{
-  Type* type_ptr = g_sym_table.getType(*m_ident_ptr);
-  if (type_ptr != NULL) {
-    return type_ptr;
-  } else {
-    error("Type '" + *m_ident_ptr + "' not declared.");
-  }
-  return NULL;  // Not reached
-}
diff --git a/src/mem/slicc/ast/TypeAST.hh b/src/mem/slicc/ast/TypeAST.hh
deleted file mode 100644
index f8e1fdc..0000000
--- a/src/mem/slicc/ast/TypeAST.hh
+++ /dev/null
@@ -1,83 +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.
- */
-
-/*
- * TypeAST.hh
- *
- * Description:
- *
- * $Id: TypeAST.hh,v 3.2 2003/03/22 15:15:17 xu Exp $
- *
- */
-
-#ifndef TYPEAST_H
-#define TYPEAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/AST.hh"
-
-class TypeAST : public AST {
-public:
-  // Constructors
-  TypeAST(string* ident_ptr);
-
-  // Destructor
-  ~TypeAST();
-
-  // Public Methods
-  string toString() const;
-  Type* lookupType() const;
-
-  virtual void print(ostream& out) const {}
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  TypeAST(const TypeAST& obj);
-  TypeAST& operator=(const TypeAST& obj);
-
-  // Data Members (m_ prefix)
-  string* m_ident_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const TypeAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const TypeAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //TYPEAST_H
diff --git a/src/mem/slicc/ast/TypeAST.py b/src/mem/slicc/ast/TypeAST.py
new file mode 100644
index 0000000..209859b
--- /dev/null
+++ b/src/mem/slicc/ast/TypeAST.py
@@ -0,0 +1,53 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.AST import AST
+
+from slicc.symbols import Type
+
+class TypeAST(AST):
+    def __init__(self, slicc, ident):
+        super(TypeAST, self).__init__(slicc)
+
+        self.ident = ident
+
+    def __repr__(self):
+        return self.ident
+
+    def __str__(self):
+        return self.ident
+
+    @property
+    def type(self, assert_type=None):
+        type = self.symtab.find(self.ident, Type)
+        if not type:
+            self.error("Type '%s' not declared.", self)
+
+        if assert_type is not None and type != assert_type:
+            self.error("Type '%s' is should be type '%s'", self, assert_type)
+
+        return type
diff --git a/src/mem/slicc/ast/TypeDeclAST.cc b/src/mem/slicc/ast/TypeDeclAST.cc
deleted file mode 100644
index bbf2f84..0000000
--- a/src/mem/slicc/ast/TypeDeclAST.cc
+++ /dev/null
@@ -1,86 +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.
- */
-
-/*
- * TypeDeclAST.C
- *
- * Description: See TypeDeclAST.hh
- *
- * $Id: TypeDeclAST.C,v 3.1 2003/03/22 15:15:17 xu Exp $
- *
- */
-
-#include "mem/slicc/ast/TypeDeclAST.hh"
-#include "mem/slicc/main.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-
-TypeDeclAST::TypeDeclAST(TypeAST* type_ast_ptr,
-                         PairListAST* pairs_ptr,
-                         Vector<TypeFieldAST*>* field_vec_ptr)
-  : DeclAST(pairs_ptr)
-{
-  m_type_ast_ptr = type_ast_ptr;
-  m_field_vec_ptr = field_vec_ptr;
-}
-
-TypeDeclAST::~TypeDeclAST()
-{
-  delete m_type_ast_ptr;
-  if (m_field_vec_ptr != NULL) {
-    int size = m_field_vec_ptr->size();
-    for(int i=0; i<size; i++) {
-      delete (*m_field_vec_ptr)[i];
-    }
-    delete m_field_vec_ptr;
-  }
-}
-
-void TypeDeclAST::generate()
-{
-  string machine_name;
-  string id = m_type_ast_ptr->toString();
-
-  // Make the new type
-  Type* new_type_ptr = new Type(id, getLocation(), getPairs(),
-                                g_sym_table.getStateMachine());
-  g_sym_table.newSym(new_type_ptr);
-
-  // Add all of the fields of the type to it
-  if (m_field_vec_ptr != NULL) {
-    int size = m_field_vec_ptr->size();
-    for(int i=0; i<size; i++) {
-      (*m_field_vec_ptr)[i]->generate(new_type_ptr);
-    }
-  }
-}
-
-void TypeDeclAST::print(ostream& out) const
-{
-  out << "[TypeDecl: " << m_type_ast_ptr->toString() << "]";
-}
diff --git a/src/mem/slicc/ast/TypeDeclAST.hh b/src/mem/slicc/ast/TypeDeclAST.hh
deleted file mode 100644
index 8a72c04..0000000
--- a/src/mem/slicc/ast/TypeDeclAST.hh
+++ /dev/null
@@ -1,86 +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.
- */
-
-/*
- * TypeDeclAST.hh
- *
- * Description:
- *
- * $Id: TypeDeclAST.hh,v 3.2 2003/03/17 01:55:28 xu Exp $
- *
- */
-
-#ifndef TypeDeclAST_H
-#define TypeDeclAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/DeclAST.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-#include "mem/slicc/ast/TypeFieldAST.hh"
-
-class TypeDeclAST : public DeclAST {
-public:
-  // Constructors
-  TypeDeclAST(TypeAST* type_ast_ptr,
-              PairListAST* pairs_ptr,
-              Vector<TypeFieldAST*>* field_vec_ptr);
-
-  // Destructor
-  ~TypeDeclAST();
-
-  // Public Methods
-  virtual void generate();
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  TypeDeclAST(const TypeDeclAST& obj);
-  TypeDeclAST& operator=(const TypeDeclAST& obj);
-
-  // Data Members (m_ prefix)
-  TypeAST* m_type_ast_ptr;
-  Vector<TypeFieldAST*>* m_field_vec_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const TypeDeclAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const TypeDeclAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //TypeDeclAST_H
diff --git a/src/mem/slicc/ast/TypeDeclAST.py b/src/mem/slicc/ast/TypeDeclAST.py
new file mode 100644
index 0000000..d2cc04e
--- /dev/null
+++ b/src/mem/slicc/ast/TypeDeclAST.py
@@ -0,0 +1,62 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.DeclAST import DeclAST
+from slicc.symbols.Type import Type
+
+class TypeDeclAST(DeclAST):
+    def __init__(self, slicc, type_ast, pairs, field_asts):
+        super(TypeDeclAST, self).__init__(slicc, pairs)
+
+        self.type_ast = type_ast
+        self.field_asts = field_asts
+
+    def __repr__(self):
+        return "[TypeDecl: %r]" % (self.type_ast)
+
+    def files(self, hh, cc, parent=None):
+        if "external" in self:
+            return
+
+        if parent:
+            ident = "%s_%s" % (parent, self.type_ast.ident)
+        else:
+            ident = self.type_ast.ident
+        hh.add("%s.hh" % ident)
+        cc.add("%s.cc" % ident)
+
+    def generate(self):
+        ident = str(self.type_ast)
+
+        # Make the new type
+        new_type = Type(self.symtab, ident, self.location, self.pairs,
+                        self.state_machine)
+        self.symtab.newSymbol(new_type)
+
+        # Add all of the fields of the type to it
+        for field in self.field_asts:
+            field.generate(new_type)
diff --git a/src/mem/slicc/ast/TypeFieldAST.cc b/src/mem/slicc/ast/TypeFieldAST.cc
deleted file mode 100644
index 5657d02..0000000
--- a/src/mem/slicc/ast/TypeFieldAST.cc
+++ /dev/null
@@ -1,44 +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.
- */
-
-/*
- * TypeFieldAST.C
- *
- * Description: See TypeFieldAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/TypeFieldAST.hh"
-
-TypeFieldAST::TypeFieldAST(PairListAST* pairs_ptr)
-  : AST(pairs_ptr->getPairs()) {
-}
-
diff --git a/src/mem/slicc/ast/TypeFieldAST.hh b/src/mem/slicc/ast/TypeFieldAST.hh
deleted file mode 100644
index 1443720..0000000
--- a/src/mem/slicc/ast/TypeFieldAST.hh
+++ /dev/null
@@ -1,83 +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.
- */
-
-/*
- * TypeFieldAST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef TypeFieldAST_H
-#define TypeFieldAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/symbols/StateMachine.hh"
-#include "mem/slicc/ast/StatementListAST.hh"
-#include "mem/slicc/ast/PairListAST.hh"
-#include "mem/slicc/ast/ExprAST.hh"
-
-class TypeFieldAST : public AST {
-public:
-  // Constructors
-  TypeFieldAST(PairListAST* pairs_ptr);
-
-  // Destructor
-  virtual ~TypeFieldAST() {}
-
-  // Public Methods
-  virtual void generate(Type *type_ptr) = 0;
-  virtual void print(ostream& out) const = 0;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  //  TypeFieldAST(const TypeFieldAST& obj);
-  //  TypeFieldAST& operator=(const TypeFieldAST& obj);
-
-  // Data Members (m_ prefix)
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const TypeFieldAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const TypeFieldAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //TypeFieldAST_H
diff --git a/src/mem/slicc/ast/TypeFieldAST.py b/src/mem/slicc/ast/TypeFieldAST.py
new file mode 100644
index 0000000..7dd4c74
--- /dev/null
+++ b/src/mem/slicc/ast/TypeFieldAST.py
@@ -0,0 +1,32 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.AST import AST
+
+class TypeFieldAST(AST):
+    def __init__(self, slicc, pairs):
+        super(TypeFieldAST, self).__init__(slicc, pairs)
diff --git a/src/mem/slicc/ast/TypeFieldEnumAST.cc b/src/mem/slicc/ast/TypeFieldEnumAST.cc
deleted file mode 100644
index 1a02f7e..0000000
--- a/src/mem/slicc/ast/TypeFieldEnumAST.cc
+++ /dev/null
@@ -1,82 +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.
- */
-
-/*
- * TypeFieldEnumAST.C
- *
- * Description: See TypeFieldEnumAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/TypeFieldEnumAST.hh"
-#include "mem/slicc/symbols/State.hh"
-#include "mem/slicc/symbols/Event.hh"
-
-TypeFieldEnumAST::TypeFieldEnumAST(string* field_id_ptr,
-                                   PairListAST* pairs_ptr)
-  : TypeFieldAST(pairs_ptr)
-{
-  m_field_id_ptr = field_id_ptr;
-  m_pairs_ptr = pairs_ptr;
-}
-
-TypeFieldEnumAST::~TypeFieldEnumAST()
-{
-  delete m_field_id_ptr;
-}
-
-void TypeFieldEnumAST::generate(Type *type_ptr)
-{
-  // Add enumeration
-  if (!type_ptr->enumAdd(*m_field_id_ptr, m_pairs_ptr->getPairs())) {
-    error("Duplicate enumeration: " + type_ptr->toString() + ":" + *m_field_id_ptr);
-  }
-
-  // Fill machine info
-  StateMachine* machine_ptr = g_sym_table.getStateMachine();
-  if (type_ptr->toString() == "State") {
-    if (machine_ptr == NULL) {
-      error("State declaration not part of a machine.");
-    }
-    machine_ptr->addState(new State(*m_field_id_ptr, getLocation(), getPairs()));
-  }
-  if (type_ptr->toString() == "Event") {
-    if (machine_ptr == NULL) {
-      error("Event declaration not part of a machine.");
-    }
-    machine_ptr->addEvent(new Event(*m_field_id_ptr, getLocation(), getPairs()));
-  }
-}
-
-void TypeFieldEnumAST::print(ostream& out) const
-{
-  out << "[TypeFieldEnum: " << *m_field_id_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/TypeFieldEnumAST.hh b/src/mem/slicc/ast/TypeFieldEnumAST.hh
deleted file mode 100644
index cd02f03..0000000
--- a/src/mem/slicc/ast/TypeFieldEnumAST.hh
+++ /dev/null
@@ -1,86 +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.
- */
-
-/*
- * TypeFieldEnumAST.hh
- *
- * Description:
- *
- * $Id: TypeFieldEnumAST.hh,v 3.2 2003/07/10 18:08:07 milo Exp $
- *
- */
-
-#ifndef TypeFieldEnumAST_H
-#define TypeFieldEnumAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/symbols/StateMachine.hh"
-#include "mem/slicc/ast/TypeFieldAST.hh"
-#include "mem/slicc/ast/StatementListAST.hh"
-#include "mem/slicc/ast/PairListAST.hh"
-
-class TypeFieldEnumAST : public TypeFieldAST {
-public:
-  // Constructors
-  TypeFieldEnumAST(string* field_id_ptr,
-                   PairListAST* pairs_ptr);
-
-  // Destructor
-  ~TypeFieldEnumAST();
-
-  // Public Methods
-  void generate(Type *type_ptr);
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  TypeFieldEnumAST(const TypeFieldEnumAST& obj);
-  TypeFieldEnumAST& operator=(const TypeFieldEnumAST& obj);
-
-  // Data Members (m_ prefix)
-  string* m_field_id_ptr;
-  PairListAST* m_pairs_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const TypeFieldEnumAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const TypeFieldEnumAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //TypeFieldEnumAST_H
diff --git a/src/mem/slicc/ast/TypeFieldEnumAST.py b/src/mem/slicc/ast/TypeFieldEnumAST.py
new file mode 100644
index 0000000..d068666
--- /dev/null
+++ b/src/mem/slicc/ast/TypeFieldEnumAST.py
@@ -0,0 +1,59 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.TypeFieldAST import TypeFieldAST
+from slicc.symbols import Event, State
+
+class TypeFieldEnumAST(TypeFieldAST):
+    def __init__(self, slicc, field_id, pairs_ast):
+        super(TypeFieldEnumAST, self).__init__(slicc, pairs_ast)
+
+        self.field_id = field_id
+        self.pairs_ast = pairs_ast
+
+    def __repr__(self):
+        return "[TypeFieldEnum: %r]" % self.field_id
+
+    def generate(self, type):
+        # Add enumeration
+        if not type.enumAdd(self.field_id, self.pairs_ast.pairs):
+            error("Duplicate enumeration: %s:%s" % (type, self.field_id))
+
+        # Fill machine info
+        machine = self.symtab.state_machine
+
+        if str(type) == "State":
+            if not machine:
+                error("State declaration not part of a machine.")
+            s = State(self.symtab, self.field_id, self.location, self.pairs)
+            machine.addState(s)
+
+        if str(type) == "Event":
+            if not machine:
+                error("Event declaration not part of a machine.")
+            e = Event(self.symtab, self.field_id, self.location, self.pairs)
+            machine.addEvent(e)
diff --git a/src/mem/slicc/ast/TypeFieldMemberAST.cc b/src/mem/slicc/ast/TypeFieldMemberAST.cc
deleted file mode 100644
index 1fe0f6d..0000000
--- a/src/mem/slicc/ast/TypeFieldMemberAST.cc
+++ /dev/null
@@ -1,84 +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.
- */
-
-/*
- * TypeFieldMemberAST.C
- *
- * Description: See TypeFieldMemberAST.hh
- *
- * $Id: TypeFieldMemberAST.C,v 3.1 2003/03/27 22:58:54 xu Exp $
- *
- */
-
-#include "mem/slicc/ast/TypeFieldMemberAST.hh"
-
-TypeFieldMemberAST::TypeFieldMemberAST(TypeAST* type_ast_ptr,
-                                       string* field_id_ptr,
-                                       PairListAST* pairs_ptr,
-                                       ExprAST* rvalue_ptr)
-  : TypeFieldAST(pairs_ptr)
-{
-  m_type_ast_ptr = type_ast_ptr;
-  m_field_id_ptr = field_id_ptr;
-  m_rvalue_ptr = rvalue_ptr;
-}
-
-TypeFieldMemberAST::~TypeFieldMemberAST()
-{
-  delete m_type_ast_ptr;
-  delete m_field_id_ptr;
-  if(m_rvalue_ptr) delete m_rvalue_ptr;
-}
-
-void TypeFieldMemberAST::generate(Type *type_ptr)
-{
-  // Lookup type
-  Type* field_type_ptr = m_type_ast_ptr->lookupType();
-
-  // check type if this is a initialization
-  string* init_code = NULL;
-  if(m_rvalue_ptr) {
-    init_code = new string();
-    Type* rvalue_type_ptr = m_rvalue_ptr->generate(*init_code);
-    if(field_type_ptr != rvalue_type_ptr) {
-      error("Initialization type mismatch '" + field_type_ptr->toString() + "' and '" + rvalue_type_ptr->toString() + "'");
-    }
-  }
-
-  // Add data member to the parent type
-  if (!type_ptr->dataMemberAdd(*m_field_id_ptr, field_type_ptr, getPairs(),
-                               init_code)) {
-    error("Duplicate data member: " + type_ptr->toString() + ":" + *m_field_id_ptr);
-  }
-}
-
-void TypeFieldMemberAST::print(ostream& out) const
-{
-  out << "[TypeFieldMember: " << *m_field_id_ptr << "]";
-}
diff --git a/src/mem/slicc/ast/TypeFieldMemberAST.hh b/src/mem/slicc/ast/TypeFieldMemberAST.hh
deleted file mode 100644
index 47355f3..0000000
--- a/src/mem/slicc/ast/TypeFieldMemberAST.hh
+++ /dev/null
@@ -1,91 +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.
- */
-
-/*
- * TypeFieldMemberAST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef TypeFieldMemberAST_H
-#define TypeFieldMemberAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/TypeFieldAST.hh"
-#include "mem/slicc/symbols/StateMachine.hh"
-#include "mem/slicc/ast/StatementListAST.hh"
-#include "mem/slicc/ast/PairListAST.hh"
-#include "mem/slicc/ast/ExprAST.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-
-class TypeFieldMemberAST : public TypeFieldAST {
-public:
-  // Constructors
-  TypeFieldMemberAST(TypeAST* type_ast_ptr,
-                     string* field_id_ptr,
-                     PairListAST* pairs_ptr,
-                     ExprAST* rvalue_ptr);
-
-  // Destructor
-  ~TypeFieldMemberAST();
-
-  // Public Methods
-  void generate(Type *type_ptr);
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  TypeFieldMemberAST(const TypeFieldMemberAST& obj);
-  TypeFieldMemberAST& operator=(const TypeFieldMemberAST& obj);
-
-  // Data Members (m_ prefix)
-  TypeAST* m_type_ast_ptr;
-  string* m_field_id_ptr;
-  ExprAST* m_rvalue_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const TypeFieldMemberAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const TypeFieldMemberAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //TypeFieldMemberAST_H
diff --git a/src/mem/slicc/ast/TypeFieldMemberAST.py b/src/mem/slicc/ast/TypeFieldMemberAST.py
new file mode 100644
index 0000000..285d5b6
--- /dev/null
+++ b/src/mem/slicc/ast/TypeFieldMemberAST.py
@@ -0,0 +1,57 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.TypeFieldAST import TypeFieldAST
+
+class TypeFieldMemberAST(TypeFieldAST):
+    def __init__(self, slicc, type_ast, field_id, pairs, rvalue):
+        super(TypeFieldMemberAST, self).__init__(slicc, pairs)
+
+        self.type_ast = type_ast
+        self.field_id = field_id
+        self.rvalue = rvalue
+
+    def __repr__(self):
+        return "[TypeFieldMember: %r]" % self.field_id
+
+    def generate(self, type):
+        # Lookup type
+        field_type = self.type_ast.type
+
+        # check type if this is a initialization
+        init_code = ""
+        if self.rvalue:
+            rvalue_type,init_code = self.rvalue.inline(True)
+            if field_type != rvalue_type:
+                self.error("Initialization type mismatch '%s' and '%s'" % \
+                           (field_type, rvalue_type))
+
+        # Add data member to the parent type
+        if not type.dataMemberAdd(self.field_id, field_type, self.pairs,
+                                  init_code):
+
+            error("Duplicate data member: %s:%s" % (type_ptr, field_id))
diff --git a/src/mem/slicc/ast/TypeFieldMethodAST.cc b/src/mem/slicc/ast/TypeFieldMethodAST.cc
deleted file mode 100644
index 03c528f..0000000
--- a/src/mem/slicc/ast/TypeFieldMethodAST.cc
+++ /dev/null
@@ -1,81 +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.
- */
-
-/*
- * TypeFieldMethodAST.C
- *
- * Description: See TypeFieldMethodAST.hh
- *
- * $Id: TypeFieldMethodAST.C,v 3.1 2003/07/10 18:08:07 milo Exp $
- *
- */
-
-#include "mem/slicc/ast/TypeFieldMethodAST.hh"
-
-TypeFieldMethodAST::TypeFieldMethodAST(TypeAST* return_type_ast_ptr,
-                                       string* ident_ptr,
-                                       Vector<TypeAST*>* type_ast_vec_ptr,
-                                       PairListAST* pairs_ptr)
-  : TypeFieldAST(pairs_ptr)
-{
-  m_return_type_ast_ptr = return_type_ast_ptr;
-  m_ident_ptr = ident_ptr;
-  m_type_ast_vec_ptr = type_ast_vec_ptr;
-}
-
-TypeFieldMethodAST::~TypeFieldMethodAST()
-{
-  delete m_return_type_ast_ptr;
-  delete m_ident_ptr;
-
-  int size = m_type_ast_vec_ptr->size();
-  for(int i=0; i<size; i++) {
-    delete (*m_type_ast_vec_ptr)[i];
-  }
-  delete m_type_ast_vec_ptr;
-}
-
-void TypeFieldMethodAST::generate(Type *type_ptr)
-{
-  // Lookup return type
-  Type* return_type_ptr = m_return_type_ast_ptr->lookupType();
-
-  // Lookup parameter types
-  Vector<Type*> type_vec;
-  int size = m_type_ast_vec_ptr->size();
-  for(int i=0; i<size; i++) {
-    Type* type_ptr = (*m_type_ast_vec_ptr)[i]->lookupType();
-    type_vec.insertAtBottom(type_ptr);
-  }
-
-  // Add method
-  if (!type_ptr->methodAdd(*m_ident_ptr, return_type_ptr, type_vec)) {  // Return false on error
-    error("Duplicate method: " + type_ptr->toString() + ":" + *m_ident_ptr + "()");
-  }
-}
diff --git a/src/mem/slicc/ast/TypeFieldMethodAST.hh b/src/mem/slicc/ast/TypeFieldMethodAST.hh
deleted file mode 100644
index 10d53ef..0000000
--- a/src/mem/slicc/ast/TypeFieldMethodAST.hh
+++ /dev/null
@@ -1,87 +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.
- */
-
-/*
- * TypeFieldMethodAST.hh
- *
- * Description:
- *
- * $Id: TypeFieldMethodAST.hh,v 3.2 2003/07/10 18:08:07 milo Exp $
- *
- */
-
-#ifndef TYPEFIELDMETHODAST_H
-#define TYPEFIELDMETHODAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/TypeFieldAST.hh"
-#include "mem/slicc/ast/TypeAST.hh"
-
-class TypeFieldMethodAST : public TypeFieldAST {
-public:
-  // Constructors
-  TypeFieldMethodAST(TypeAST* return_type_ast_ptr,
-                     string* ident_ptr,
-                     Vector<TypeAST*>* type_ast_vec_ptr,
-                     PairListAST* pairs_ptr);
-  // Destructor
-  ~TypeFieldMethodAST();
-
-  // Public Methods
-
-  void generate(Type *type_ptr);
-  void print(ostream& out) const {}
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  TypeFieldMethodAST(const TypeFieldMethodAST& obj);
-  TypeFieldMethodAST& operator=(const TypeFieldMethodAST& obj);
-
-  // Data Members (m_ prefix)
-  TypeAST* m_return_type_ast_ptr;
-  string* m_ident_ptr;
-  Vector<TypeAST*>* m_type_ast_vec_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const TypeFieldMethodAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const TypeFieldMethodAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //TYPEFIELDMETHODAST_H
diff --git a/src/mem/slicc/ast/TypeFieldMethodAST.py b/src/mem/slicc/ast/TypeFieldMethodAST.py
new file mode 100644
index 0000000..337b155
--- /dev/null
+++ b/src/mem/slicc/ast/TypeFieldMethodAST.py
@@ -0,0 +1,50 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.TypeFieldAST import TypeFieldAST
+
+class TypeFieldMethodAST(TypeFieldAST):
+    def __init__(self, slicc, return_type_ast, ident, type_asts, pairs):
+        super(TypeFieldMethodAST, self).__init__(slicc, pairs)
+
+        self.return_type_ast = return_type_ast
+        self.ident = ident
+        self.type_asts = type_asts
+
+    def __repr__(self):
+        return ""
+
+    def generate(self, type):
+        # Lookup return type
+        return_type = self.return_type_ast.type
+
+        # Lookup parameter types
+        types = [ t.type for t in self.type_asts ]
+
+        # Add method
+        if not type.methodAdd(self.ident, return_type, types):
+            error("Duplicate method: %s:%s()" % (type, self.ident))
diff --git a/src/mem/slicc/ast/VarExprAST.cc b/src/mem/slicc/ast/VarExprAST.cc
deleted file mode 100644
index 13e2655..0000000
--- a/src/mem/slicc/ast/VarExprAST.cc
+++ /dev/null
@@ -1,76 +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.
- */
-
-/*
- * VarExprAST.C
- *
- * Description: See VarExprAST.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/ast/VarExprAST.hh"
-#include "mem/slicc/ast/StatementAST.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-
-VarExprAST::~VarExprAST()
-{
-  delete m_var_ptr;
-}
-
-
-Var* VarExprAST::getVar() const
-{
-  string var = *m_var_ptr;
-  Var* var_ptr = g_sym_table.getVar(var);
-  if (var_ptr == NULL) {
-    error("Unrecognized variable: " + var);
-  }
-  return var_ptr;
-}
-
-void VarExprAST::assertType(string type_ident) const
-{
-  Type* expected_type_ptr = g_sym_table.getType(type_ident);
-  if (expected_type_ptr == NULL) {
-    error("There must be a type '" + type_ident + "' declared in this scope");
-  }
-
-  if (getVar()->getType() != expected_type_ptr) {
-    error("Incorrect type: '" + getVar()->getIdent() + "' is expected to be type '" + expected_type_ptr->toString() + "'");
-  }
-}
-
-Type* VarExprAST::generate(string& code) const
-{
-  Var* var_ptr = getVar();
-  code += var_ptr->getCode();
-  return var_ptr->getType();
-}
diff --git a/src/mem/slicc/ast/VarExprAST.hh b/src/mem/slicc/ast/VarExprAST.hh
deleted file mode 100644
index ea32582..0000000
--- a/src/mem/slicc/ast/VarExprAST.hh
+++ /dev/null
@@ -1,86 +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.
- */
-
-/*
- * VarExprAST.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef VAREXPRAST_H
-#define VAREXPRAST_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/ExprAST.hh"
-class Var;
-
-class VarExprAST : public ExprAST {
-public:
-  // Constructors
-  VarExprAST(string* var_ptr) : ExprAST() { m_var_ptr = var_ptr; }
-
-  // Destructor
-  ~VarExprAST();
-
-  // Public Methods
-  Type* generate(string& code) const;
-  void print(ostream& out) const { out << "[VarExprAST: " << *m_var_ptr << "]"; }
-  string getName() const { return *m_var_ptr; }
-  Var* getVar() const;
-  void assertType(string type_ident) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  VarExprAST(const VarExprAST& obj);
-  VarExprAST& operator=(const VarExprAST& obj);
-
-  // Data Members (m_ prefix)
-  string* m_var_ptr;
-
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const VarExprAST& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const VarExprAST& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //VAREXPRAST_H
diff --git a/src/mem/slicc/ast/VarExprAST.py b/src/mem/slicc/ast/VarExprAST.py
new file mode 100644
index 0000000..ac440bb
--- /dev/null
+++ b/src/mem/slicc/ast/VarExprAST.py
@@ -0,0 +1,66 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.ExprAST import ExprAST
+from slicc.symbols import Type, Var
+
+class VarExprAST(ExprAST):
+    def __init__(self, slicc, var):
+        super(VarExprAST, self).__init__(slicc)
+        self._var = var
+
+    def __repr__(self):
+        return "[VarExprAST: %r]" % self._var
+
+    @property
+    def name(self):
+        return str(self._var)
+
+    @property
+    def var(self):
+        var = self.symtab.find(self._var, Var)
+        if not var:
+            self.error("Unrecognized variable: %s", self._var)
+        return var
+
+    def assertType(self, type_ident):
+        expected_type = self.symtab.find(type_ident, Type)
+
+        if not expected_type:
+            self.error("There must be a type '%s' declared in this scope",
+                       type_ident)
+
+        if self.var.type != expected_type:
+            self.error("Incorrect type: " + \
+                       "'%s' is expected to be type '%s' not '%s'",
+                       self.var.ident, expected_type, self.var.type)
+
+    def generate(self, code):
+        fix = code.nofix()
+        code("${{self.var.code}}")
+        code.fix(fix)
+        return self.var.type
diff --git a/src/mem/slicc/ast/__init__.py b/src/mem/slicc/ast/__init__.py
new file mode 100644
index 0000000..de50cbd
--- /dev/null
+++ b/src/mem/slicc/ast/__init__.py
@@ -0,0 +1,69 @@
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.ast.AST import *
+
+# actual ASTs
+from slicc.ast.ActionDeclAST import *
+from slicc.ast.AssignStatementAST import *
+from slicc.ast.CheckAllocateStatementAST import *
+from slicc.ast.CheckStopSlotsStatementAST import *
+from slicc.ast.ChipComponentAccessAST import *
+from slicc.ast.CopyHeadStatementAST import *
+from slicc.ast.DeclAST import *
+from slicc.ast.DeclListAST import *
+from slicc.ast.EnqueueStatementAST import *
+from slicc.ast.EnumDeclAST import *
+from slicc.ast.EnumExprAST import *
+from slicc.ast.ExprAST import *
+from slicc.ast.ExprStatementAST import *
+from slicc.ast.FormalParamAST import *
+from slicc.ast.FuncCallExprAST import *
+from slicc.ast.FuncDeclAST import *
+from slicc.ast.IfStatementAST import *
+from slicc.ast.InPortDeclAST import *
+from slicc.ast.InfixOperatorExprAST import *
+from slicc.ast.LiteralExprAST import *
+from slicc.ast.MachineAST import *
+from slicc.ast.MemberExprAST import *
+from slicc.ast.MethodCallExprAST import *
+from slicc.ast.NewExprAST import *
+from slicc.ast.ObjDeclAST import *
+from slicc.ast.OutPortDeclAST import *
+from slicc.ast.PairAST import *
+from slicc.ast.PairListAST import *
+from slicc.ast.PeekStatementAST import *
+from slicc.ast.ReturnStatementAST import *
+from slicc.ast.StatementAST import *
+from slicc.ast.StatementListAST import *
+from slicc.ast.TransitionDeclAST import *
+from slicc.ast.TypeAST import *
+from slicc.ast.TypeDeclAST import *
+from slicc.ast.TypeFieldAST import *
+from slicc.ast.TypeFieldEnumAST import *
+from slicc.ast.TypeFieldMemberAST import *
+from slicc.ast.TypeFieldMethodAST import *
+from slicc.ast.VarExprAST import *
diff --git a/src/mem/slicc/generate/__init__.py b/src/mem/slicc/generate/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/mem/slicc/generate/__init__.py
diff --git a/src/mem/slicc/generate/dot.py b/src/mem/slicc/generate/dot.py
new file mode 100644
index 0000000..7626589
--- /dev/null
+++ b/src/mem/slicc/generate/dot.py
@@ -0,0 +1,42 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util.code_formatter import code_formatter
+
+def printDotty(sm, code):
+    code('digraph ${{sm.getIdent()}} {')
+    code.indent()
+    for t in sm.transitions:
+        # Don't print ignored transitions
+        if t.getActionShorthands() in ("--", "z"):
+            continue
+
+        code('${{t.getStateShorthand()}} -> ${{t.getNextStateShorthand()}')
+        code('    [label="${{t.getEventShorthand()}}/${{t.getActionShorthands()}}"')
+    code.dedent()
+    code('}')
+
diff --git a/src/mem/slicc/generate/html.py b/src/mem/slicc/generate/html.py
new file mode 100644
index 0000000..53252ce
--- /dev/null
+++ b/src/mem/slicc/generate/html.py
@@ -0,0 +1,80 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util.code_formatter import code_formatter
+
+def createSymbol(symbol, title):
+    code = code_formatter()
+    code('''<HTML><BODY><BIG>
+$title:
+${{formatShorthand(symbol.short)}} - ${{symbol.desc}}</BIG></BODY></HTML>''')
+    return code
+
+def formatShorthand(short):
+    munged_shorthand = ""
+    mode_is_normal = True
+
+    # -- Walk over the string, processing superscript directives
+    gen = enumerate(short)
+    for i,c in gen:
+        if c == '!':
+            # -- Reached logical end of shorthand name
+            break
+        elif c == '_':
+            munged_shorthand += " "
+        elif c == '^':
+            # -- Process super/subscript formatting
+            mode_is_normal = not mode_is_normal
+            if mode_is_normal:
+                # -- Back to normal mode
+                munged_shorthand += "</SUP>"
+            else:
+                # -- Going to superscript mode
+                munged_shorthand += "<SUP>"
+        elif c == '\\':
+            # -- Process Symbol character set
+            if i + 1 < len(short):
+                # -- Proceed to next char. Yes I know that changing
+                # the loop var is ugly!
+                i,c = gen.next()
+                munged_shorthand += "<B><FONT size=+1>"
+                munged_shorthand += c
+                munged_shorthand += "</FONT></B>"
+            else:
+                # -- FIXME: Add line number info later
+                panic("Encountered a `\\` without anything following it!")
+        else:
+            # -- Pass on un-munged
+            munged_shorthand += c
+
+    # -- Do any other munging
+    if not mode_is_normal:
+        # -- Back to normal mode
+        munged_shorthand += "</SUP>"
+
+    return munged_shorthand
+
diff --git a/src/mem/slicc/generate/tex.py b/src/mem/slicc/generate/tex.py
new file mode 100644
index 0000000..97c63eb
--- /dev/null
+++ b/src/mem/slicc/generate/tex.py
@@ -0,0 +1,71 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util.code_formatter import code_formatter
+
+class tex_formatter(code_formatter):
+    braced = "<>"
+    double_braced = "<<>>"
+
+def printTexTable(sm, code):
+    tex = tex_formatter()
+    tex(r'''
+%& latex
+\documentclass[12pt]{article}
+\usepackage{graphics}
+\begin{document}
+\begin{tabular}{|l||$<<"l" * len(sm.events)>>|} \hline
+''')
+
+    for event in sm.events:
+        code(r" & \rotatebox{90}{$<<event.short>>}")
+    tex(r'\\ \hline \hline')
+
+    for state in sm.states:
+        state_str = state.short
+        for event in sm.events:
+            state_str += ' & '
+            trans = sm.get_transition(state, event)
+            if trans:
+                actions = trans.getActionShorthands()
+                # FIXME: should compare index, not the string
+                if trans.getNextStateShorthand() != state.short:
+                    nextState = trans.getNextStateShorthand()
+                else:
+                    nextState = ""
+                state_str += actions
+                if nextState and actions:
+                    state_str += '/'
+                state_str += nextState
+        tex(r'$0 \\', state_str)
+    tex(r'''
+\hline
+\end{tabular}
+\end{document}
+''')
+
+    code.append(tex)
diff --git a/src/mem/slicc/generator/fileio.cc b/src/mem/slicc/generator/fileio.cc
deleted file mode 100644
index 15eccd3..0000000
--- a/src/mem/slicc/generator/fileio.cc
+++ /dev/null
@@ -1,66 +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.
- */
-
-/*
- * fileio.C
- *
- * Description: See fileio.hh
- *
- * $Id: fileio.C,v 3.3 2003/07/10 18:08:08 milo Exp $
- *
- * */
-
-#include "mem/slicc/generator/fileio.hh"
-
-void conditionally_write_file(string filename, ostringstream& sstr)
-{
-  ofstream out;
-  ifstream in;
-  string input_file;
-
-  // Read in the file if it exists
-  in.open(filename.c_str());
-  char c;
-  while (in.get(c)) {
-    input_file += c;
-  }
-  in.close();
-
-  // Check to see if the file is the same as what we want to write
-  if (input_file != sstr.str()) {
-    cout << "    Overwriting file: " << filename << endl;
-    // Overwrite the old file with the new file
-    out.open(filename.c_str());
-    out << sstr.str();
-    out.close();
-  } else {
-    //cout << "    Keeping old file: " << filename << endl;
-  }
-}
-
diff --git a/src/mem/slicc/generator/fileio.hh b/src/mem/slicc/generator/fileio.hh
deleted file mode 100644
index 81b7306..0000000
--- a/src/mem/slicc/generator/fileio.hh
+++ /dev/null
@@ -1,46 +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.
- */
-
-/*
- * fileio.hh
- *
- * Description:
- *
- * $Id: fileio.hh,v 3.2 2003/02/24 20:54:25 xu Exp $
- *
- * */
-
-#ifndef FILEIO_H
-#define FILEIO_H
-
-#include "mem/slicc/slicc_global.hh"
-
-void conditionally_write_file(string filename, ostringstream& sstr);
-
-#endif //FILEIO_H
diff --git a/src/mem/slicc/generator/html_gen.cc b/src/mem/slicc/generator/html_gen.cc
deleted file mode 100644
index 2d35dcc..0000000
--- a/src/mem/slicc/generator/html_gen.cc
+++ /dev/null
@@ -1,125 +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.
- */
-
-/*
- * html_gen.C
- *
- * Description: See html_gen.hh
- *
- * $Id: html_gen.C,v 3.4 2004/01/31 20:46:50 milo Exp $
- *
- * */
-
-#include "mem/slicc/generator/html_gen.hh"
-#include "mem/slicc/generator/fileio.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-
-string formatHTMLShorthand(const string shorthand);
-
-
-void createHTMLSymbol(const Symbol& sym, string title, ostream& out)
-{
-  out << "<HTML><BODY><BIG>" << endl;
-  out << title << ": " << endl;
-  out << formatHTMLShorthand(sym.getShorthand()) << " - ";
-  out << sym.getDescription();
-  out << "</BIG></BODY></HTML>" << endl;
-}
-
-void createHTMLindex(string title, ostream& out)
-{
-  out << "<html>" << endl;
-  out << "<head>" << endl;
-  out << "<title>" << title << "</title>" << endl;
-  out << "</head>" << endl;
-  out << "<frameset rows=\"*,30\">" << endl;
-  Vector<StateMachine*> machine_vec = g_sym_table.getStateMachines();
-  if (machine_vec.size() > 1) {
-    string machine = machine_vec[0]->getIdent();
-    out << "  <frame name=\"Table\" src=\"" << machine << "_table.html\">" << endl;
-  } else {
-    out << "  <frame name=\"Table\" src=\"empty.html\">" << endl;
-  }
-
-  out << "  <frame name=\"Status\" src=\"empty.html\">" << endl;
-  out << "</frameset>" << endl;
-  out << "</html>" << endl;
-}
-
-string formatHTMLShorthand(const string shorthand)
-{
-  string munged_shorthand = "";
-  bool mode_is_normal = true;
-
-  // -- Walk over the string, processing superscript directives
-  for(unsigned int i = 0; i < shorthand.length(); i++) {
-    if(shorthand[i] == '!') {
-      // -- Reached logical end of shorthand name
-      break;
-    } else if( shorthand[i] == '_') {
-      munged_shorthand += " ";
-    } else if( shorthand[i] == '^') {
-      // -- Process super/subscript formatting
-      mode_is_normal = !mode_is_normal;
-      if(mode_is_normal) {
-        // -- Back to normal mode
-        munged_shorthand += "</SUP>";
-      } else {
-        // -- Going to superscript mode
-        munged_shorthand += "<SUP>";
-      }
-    } else if(shorthand[i] == '\\') {
-      // -- Process Symbol character set
-      if((i + 1) < shorthand.length()) {
-        i++;  // -- Proceed to next char. Yes I know that changing the loop var is ugly!
-        munged_shorthand += "<B><FONT size=+1>";
-        munged_shorthand += shorthand[i];
-        munged_shorthand += "</FONT></B>";
-      } else {
-        // -- FIXME: Add line number info later
-        cerr << "Encountered a `\\` without anything following it!" << endl;
-        exit( -1 );
-      }
-    } else {
-      // -- Pass on un-munged
-      munged_shorthand += shorthand[i];
-    }
-  } // -- end for all characters in shorthand
-
-  // -- Do any other munging
-  if(!mode_is_normal) {
-    // -- Back to normal mode
-    munged_shorthand += "</SUP>";
-  }
-
-  // -- Return the formatted shorthand name
-  return munged_shorthand;
-}
-
-
diff --git a/src/mem/slicc/generator/html_gen.hh b/src/mem/slicc/generator/html_gen.hh
deleted file mode 100644
index 6b1f8ea..0000000
--- a/src/mem/slicc/generator/html_gen.hh
+++ /dev/null
@@ -1,49 +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.
- */
-
-/*
- * html_gen.hh
- *
- * Description:
- *
- * $Id: html_gen.hh,v 3.1 2001/12/12 01:00:35 milo Exp $
- *
- * */
-
-#ifndef HTML_GEN_H
-#define HTML_GEN_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/symbols/StateMachine.hh"
-
-string formatHTMLShorthand(const string shorthand);
-void createHTMLindex(string title, ostream& out);
-void createHTMLSymbol(const Symbol& sym, string title, ostream& out);
-
-#endif //HTML_GEN_H
diff --git a/src/mem/slicc/generator/mif_gen.cc b/src/mem/slicc/generator/mif_gen.cc
deleted file mode 100644
index 2dca149..0000000
--- a/src/mem/slicc/generator/mif_gen.cc
+++ /dev/null
@@ -1,1718 +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/generator/mif_gen.hh"
-#include "mem/slicc/symbols/State.hh"
-#include "mem/slicc/symbols/Event.hh"
-#include "mem/slicc/symbols/Action.hh"
-#include "mem/slicc/symbols/Transition.hh"
-
-// -- Helper functions
-string formatShorthand(const string shorthand);
-string formatCellRuling(const string shorthand);
-
-void printStateTableMIF(const StateMachine& sm, ostream& out)
-{
- const string mif_prolog1 =
-"<MIFFile 5.50> # Generated by Multifacet MIF Mungers Inc\n\
-<Tbls\n\
- <Tbl\n\
-  <TblID 1>\n\
-  <TblTag `Format A'>\n\
-  <TblFormat\n\
-\n\
-   <TblAlignment Center>\n\
-\n\
-   # <TblXColumnNum 0>\n\
-   <TblXColumnRuling `Medium'>\n\
-\n\
-   <TblLRuling `Medium'>\n\
-   <TblRRuling `Medium'>\n\
-   <TblTRuling `Medium'>\n\
-   <TblBRuling `Medium'>\n\
-\n\
-   <TblColumn\n\
-    <TblColumnNum 0>\n\
-    <TblColumnWidth  0.51\">\n\
-    <TblColumnH\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnH\n\
-    <TblColumnBody\n\
-     <PgfTag `CellBody'>\n\
-    > # end of TblColumnBody\n\
-    <TblColumnF\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnF\n\
-   > # end of TblColumn\n\
-   <TblColumn\n\
-    <TblColumnNum 1>\n\
-    <TblColumnWidth  0.51\">\n\
-    <TblColumnH\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnH\n\
-    <TblColumnBody\n\
-     <PgfTag `CellBody'>\n\
-    > # end of TblColumnBody\n\
-    <TblColumnF\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnF\n\
-   > # end of TblColumn\n\
-  > # end of TblFormat\n\
-\n\
-  <TblNumColumns 2>\n\
-  <TblColumnWidth  0.51\">\n\
-  <TblColumnWidth  6.00\">\n\
-  <TblTitle\n\
-   <TblTitleContent\n\
-    <Para\n\
-     <PgfTag `TableTitle'>\n\
-     <Pgf\n\
-      <PgfAlignment Center>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-     > # end of Pgf\n\
-     <PgfNumString `TABLE 1. '>\n\
-     <ParaLine\n\
-      <Marker\n\
-       <MType 9>\n\
-       <MTypeName `Cross-Ref'>\n\
-       <MCurrPage `1'>\n\
-      > # end of Marker\n\
-      <String `";
-
- const string mif_prolog2 =
-   "'>\n\
-     > # end of ParaLine\n\
-    > # end of Para\n\
-   > # end of TblTitleContent\n\
-  > # end of TblTitle\n\
-\n\
-  <TblH\n\
-   <Row\n\
-    <RowMaxHeight  14.0\">\n\
-    <RowHeight  0.44444\">\n\
-    <Cell\n\
-     <CellLRuling `Medium'>\n\
-     <CellBRuling `Medium'>\n\
-     <CellRRuling `Medium'>\n\
-     <CellTRuling `Medium'>\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellHeading'>\n\
-       <Pgf\n\
-        <PgfAlignment Center>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-       >\n\
-       <ParaLine\n\
-        <String `State'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-    <Cell\n\
-     <CellLRuling `Medium'>\n\
-     <CellBRuling `Medium'>\n\
-     <CellRRuling `Medium'>\n\
-     <CellTRuling `Medium'>\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellHeading'>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-       <ParaLine\n\
-        <String `Description'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-   > # end of Row\n\
-  > # end of TblH\n\
-\n\
-  <TblBody\n\
-";
-
- const string row_before_state =
-" <Row\n\
-    <RowMaxHeight  14.0\">\n\
-    <RowHeight  0.22222\">\n\
-    <Cell\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellBody'>\n\
-       <Pgf\n\
-        <PgfAlignment Center>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-       >\n\
-       <ParaLine\n\
-         <String `";
-
- const string row_between_state_desc =
-         "'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-    <Cell\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellBody'>\n\
-       <ParaLine\n\
-        <String `";
-
- const string row_after_desc =
-        "'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-   > # end of Row\n\
-";
-
- const string mif_epilog =
-"  > # end of TblBody\n\
- > # end of Tbl\n\
-> # end of Tbls\n\
-\n\
- <Para\n\
-  <ParaLine\n\
-   <ATbl 1>\n\
-  > # end of ParaLine\n\
- > # end of Para\n\
-\n\
-# End of MIFFile\n\
-";
-
- out << mif_prolog1;
- out << formatShorthand( sm.getShorthand() );
- out << " states";
- out << mif_prolog2;
-
- for( int i = 0; i < sm.numStates(); i++ )
- {
-   out << row_before_state;
-   out << formatShorthand( sm.getState( i ).getShorthand() );
-   out << row_between_state_desc;
-   out << sm.getState( i ).getDescription();
-   out << row_after_desc;
- }
-
- out << mif_epilog;
-}
-
-
-void printEventTableMIF(const StateMachine& sm, ostream& out)
-{
- const string mif_prolog1 =
-"<MIFFile 5.50> # Generated by Multifacet MIF Mungers Inc\n\
-<Tbls\n\
- <Tbl\n\
-  <TblID 1>\n\
-  <TblTag `Format A'>\n\
-  <TblFormat\n\
-\n\
-   <TblAlignment Center>\n\
-\n\
-   # <TblXColumnNum 0>\n\
-   <TblXColumnRuling `Medium'>\n\
-\n\
-   <TblLRuling `Medium'>\n\
-   <TblRRuling `Medium'>\n\
-   <TblTRuling `Medium'>\n\
-   <TblBRuling `Medium'>\n\
-\n\
-   <TblColumn\n\
-    <TblColumnNum 0>\n\
-    <TblColumnWidth  0.51\">\n\
-    <TblColumnH\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnH\n\
-    <TblColumnBody\n\
-     <PgfTag `CellBody'>\n\
-    > # end of TblColumnBody\n\
-    <TblColumnF\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnF\n\
-   > # end of TblColumn\n\
-   <TblColumn\n\
-    <TblColumnNum 1>\n\
-    <TblColumnWidth  0.51\">\n\
-    <TblColumnH\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnH\n\
-    <TblColumnBody\n\
-     <PgfTag `CellBody'>\n\
-    > # end of TblColumnBody\n\
-    <TblColumnF\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnF\n\
-   > # end of TblColumn\n\
-  > # end of TblFormat\n\
-\n\
-  <TblNumColumns 2>\n\
-  <TblColumnWidth  0.51\">\n\
-  <TblColumnWidth  6.00\">\n\
-  <TblTitle\n\
-   <TblTitleContent\n\
-    <Para\n\
-     <PgfTag `TableTitle'>\n\
-     <Pgf\n\
-      <PgfAlignment Center>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-     > # end of Pgf\n\
-     <PgfNumString `TABLE 1. '>\n\
-     <ParaLine\n\
-      <Marker\n\
-       <MType 9>\n\
-       <MTypeName `Cross-Ref'>\n\
-       <MCurrPage `1'>\n\
-      > # end of Marker\n\
-      <String `";
- const string mif_prolog2 =
-"'>\n\
-     > # end of ParaLine\n\
-    > # end of Para\n\
-   > # end of TblTitleContent\n\
-  > # end of TblTitle\n\
-\n\
-  <TblH\n\
-   <Row\n\
-    <RowMaxHeight  14.0\">\n\
-    <RowHeight  0.44444\">\n\
-    <Cell\n\
-     <CellLRuling `Medium'>\n\
-     <CellBRuling `Medium'>\n\
-     <CellRRuling `Medium'>\n\
-     <CellTRuling `Medium'>\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellHeading'>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-       <Pgf\n\
-        <PgfAlignment Center>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-       >\n\
-       <ParaLine\n\
-        <String `Event'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-    <Cell\n\
-     <CellLRuling `Medium'>\n\
-     <CellBRuling `Medium'>\n\
-     <CellRRuling `Medium'>\n\
-     <CellTRuling `Medium'>\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellHeading'>\n\
-       <ParaLine\n\
-        <String `Description'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-   > # end of Row\n\
-  > # end of TblH\n\
-\n\
-  <TblBody\n\
-";
-
- const string row_before_event =
-" <Row\n\
-    <RowMaxHeight  14.0\">\n\
-    <RowHeight  0.22222\">\n\
-    <Cell\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellBody'>\n\
-       <Pgf\n\
-        <PgfAlignment Center>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-       >\n\
-       <ParaLine\n\
-         <String `";
-
- const string row_between_event_desc =
-         "'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-    <Cell\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellBody'>\n\
-       <ParaLine\n\
-        <String `";
-
- const string row_after_desc =
-        "'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-   > # end of Row\n\
-";
-
- const string mif_epilog =
-"  > # end of TblBody\n\
- > # end of Tbl\n\
-> # end of Tbls\n\
-\n\
- <Para\n\
-  <ParaLine\n\
-   <ATbl 1>\n\
-  > # end of ParaLine\n\
- > # end of Para\n\
-\n\
-# End of MIFFile\n\
-";
-
- out << mif_prolog1;
- out << formatShorthand( sm.getShorthand() );
- out << " events";
- out << mif_prolog2;
-
- for( int i = 0; i < sm.numEvents(); i++ )
- {
-   out << row_before_event;
-   out << formatShorthand( sm.getEvent( i ).getShorthand() );
-   out << row_between_event_desc;
-   out << sm.getEvent( i ).getDescription();
-   out << row_after_desc;
- }
-
- out << mif_epilog;
-}
-
-
-void printActionTableMIF(const StateMachine& sm, ostream& out)
-{
- const string mif_prolog1 =
-"<MIFFile 5.50> # Generated by Multifacet MIF Mungers Inc\n\
-<Tbls\n\
- <Tbl\n\
-  <TblID 1>\n\
-  <TblTag `Format A'>\n\
-  <TblFormat\n\
-\n\
-   <TblAlignment Center>\n\
-\n\
-   # <TblXColumnNum 0>\n\
-   <TblXColumnRuling `Medium'>\n\
-\n\
-   <TblLRuling `Medium'>\n\
-   <TblRRuling `Medium'>\n\
-   <TblTRuling `Medium'>\n\
-   <TblBRuling `Medium'>\n\
-\n\
-   <TblColumn\n\
-    <TblColumnNum 0>\n\
-    <TblColumnWidth  0.51\">\n\
-    <TblColumnH\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnH\n\
-    <TblColumnBody\n\
-     <PgfTag `CellBody'>\n\
-    > # end of TblColumnBody\n\
-    <TblColumnF\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnF\n\
-   > # end of TblColumn\n\
-   <TblColumn\n\
-    <TblColumnNum 1>\n\
-    <TblColumnWidth  0.51\">\n\
-    <TblColumnH\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnH\n\
-    <TblColumnBody\n\
-     <PgfTag `CellBody'>\n\
-    > # end of TblColumnBody\n\
-    <TblColumnF\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnF\n\
-   > # end of TblColumn\n\
-  > # end of TblFormat\n\
-\n\
-  <TblNumColumns 2>\n\
-  <TblColumnWidth  0.51\">\n\
-  <TblColumnWidth  6.00\">\n\
-  <TblTitle\n\
-   <TblTitleContent\n\
-    <Para\n\
-     <PgfTag `TableTitle'>\n\
-     <Pgf\n\
-      <PgfAlignment Center>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-     > # end of Pgf\n\
-     <PgfNumString `TABLE 1. '>\n\
-     <ParaLine\n\
-      <Marker\n\
-       <MType 9>\n\
-       <MTypeName `Cross-Ref'>\n\
-       <MCurrPage `1'>\n\
-      > # end of Marker\n\
-      <String `";
- const string mif_prolog2 =
-"'>\n\
-     > # end of ParaLine\n\
-    > # end of Para\n\
-   > # end of TblTitleContent\n\
-  > # end of TblTitle\n\
-\n\
-  <TblH\n\
-   <Row\n\
-    <RowMaxHeight  14.0\">\n\
-    <RowHeight  0.44444\">\n\
-    <Cell\n\
-     <CellLRuling `Medium'>\n\
-     <CellBRuling `Medium'>\n\
-     <CellRRuling `Medium'>\n\
-     <CellTRuling `Medium'>\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellHeading'>\n\
-       <Pgf\n\
-        <PgfAlignment Center>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-       >\n\
-       <ParaLine\n\
-        <String `Action'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-    <Cell\n\
-     <CellLRuling `Medium'>\n\
-     <CellBRuling `Medium'>\n\
-     <CellRRuling `Medium'>\n\
-     <CellTRuling `Medium'>\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellHeading'>\n\
-       <ParaLine\n\
-        <String `Description'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-   > # end of Row\n\
-  > # end of TblH\n\
-\n\
-  <TblBody\n\
-";
-
- const string row_before_action =
-" <Row\n\
-    <RowMaxHeight  14.0\">\n\
-    <RowHeight  0.22222\">\n\
-    <Cell\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellBody'>\n\
-       <Pgf\n\
-        <PgfAlignment Center>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-       >\n\
-       <ParaLine\n\
-         <String `";
-
- const string row_between_action_desc =
-         "'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-    <Cell\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellBody'>\n\
-       <ParaLine\n\
-        <String `";
-
- const string row_after_desc =
-        "'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-   > # end of Row\n\
-";
-
- const string mif_epilog =
-"  > # end of TblBody\n\
- > # end of Tbl\n\
-> # end of Tbls\n\
-\n\
- <Para\n\
-  <ParaLine\n\
-   <ATbl 1>\n\
-  > # end of ParaLine\n\
- > # end of Para\n\
-\n\
-# End of MIFFile\n\
-";
-
- out << mif_prolog1;
- out << formatShorthand( sm.getShorthand() );
- out << " actions";
- out << mif_prolog2;
-
- for( int i = 0; i < sm.numActions(); i++ )
- {
-   out << row_before_action;
-   out << formatShorthand( sm.getAction( i ).getShorthand() );
-   out << row_between_action_desc;
-   out << sm.getAction( i ).getDescription();
-   out << row_after_desc;
- }
-
- out << mif_epilog;
-}
-
-
-void printTransitionTableMIF(const StateMachine& sm, ostream& out)
-{
-  const string mif_prolog =
-"<MIFFile 5.50> # Generated by Multifacet MIF Mungers Inc\n\
-<Tbls\n\
- <Tbl\n\
-  <TblID 1>\n\
-  <TblTag `Format A'>\n\
-  <TblFormat\n\
-\n\
-   <TblAlignment Center>\n\
-\n\
-   # <TblXColumnNum 0>\n\
-   <TblXColumnRuling `Medium'>\n\
-\n\
-   <TblLRuling `Medium'>\n\
-   <TblRRuling `Medium'>\n\
-   <TblTRuling `Medium'>\n\
-   <TblBRuling `Medium'>\n\
- \n\
-";
-
-  const string tbl_fmt_before_col_num =
-"  <TblColumn\n\
-    <TblColumnNum ";
-
-  const string tbl_fmt_after_col_num =
-                    ">\n\
-    <TblColumnWidth  0.51\">\n\
-    <TblColumnH\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnH\n\
-    <TblColumnBody\n\
-     <PgfTag `CellBody'>\n\
-    > # end of TblColumnBody\n\
-    <TblColumnF\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnF\n\
-   > # end of TblColumn\n\
-";
-
-  const string tbl_fmt_before_num_cols =
-" > # end of TblFormat\n\
-\n\
-  <TblNumColumns ";
-
-  const string tbl_fmt_each_col_width_begin =
-                     ">\n\
-   <TblColumnWidth  ";
-
-  const string tbl_fmt_each_col_width_end = "\"";
-
-  const string tbl_before_first_header1 =
-                      ">\n\
-  <TblTitle\n\
-   <TblTitleContent\n\
-    <Para\n\
-     <PgfTag `TableTitle'>\n\
-     <Pgf\n\
-      <PgfAlignment Center>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-     > # end of Pgf\n\
-     <PgfNumString `TABLE 1. '>\n\
-     <ParaLine\n\
-      <Marker\n\
-       <MType 9>\n\
-       <MTypeName `Cross-Ref'>\n\
-       <MCurrPage `1'>\n\
-      > # end of Marker\n\
-      <String `";
-
-  const string tbl_before_first_header2 =
-    "'>\n\
-     > # end of ParaLine\n\
-    > # end of Para\n\
-   > # end of TblTitleContent\n\
-  > # end of TblTitle\n\
-\n\
-  <TblH\n\
-   <Row\n\
-    <RowMaxHeight  14.0\">\n\
-    <RowHeight  0.44444\">";
-
-  const string tbl_before_each_header =
-"   <Cell\n\
-     <CellLRuling `Medium'>\n\
-     <CellBRuling `Medium'>\n\
-     <CellRRuling `Medium'>\n\
-     <CellTRuling `Medium'>\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellHeading'>\n\
-       <Pgf\n\
-        <PgfAlignment Center>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-       >\n\
-       <ParaLine\n\
-         <String `";
-
-  const string tbl_before_each_rot_header =
-"   <Cell\n\
-     <CellLRuling `Medium'>\n\
-     <CellBRuling `Medium'>\n\
-     <CellRRuling `Medium'>\n\
-     <CellTRuling `Medium'>\n\
-     <CellAngle 270>\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellHeading'>\n\
-       <ParaLine\n\
-         <String `";
-
-  const string tbl_after_each_header =
-                  "'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-";
-
-  const string before_first_row =
-"   > # end of Row\n\
-  > # end of TblH\n\
-\n\
-  <TblBody\n\
-";
-
-  const string row_before_first_cell =
-" <Row\n\
-    <RowMaxHeight  14.0\">\n\
-    <RowHeight  0.22222\">";
-
-  const string row_cell_before_ruling =
-"    <Cell\n\
-";
-
-  const string row_cell_before_contents =
-"    <CellContent\n\
-      <Para\n\
-       <PgfTag `CellBody'>\n\
-       <Pgf\n\
-        <PgfAlignment Center>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-       >\n\
-       <ParaLine\n\
-         <String `";
-
-  const string row_cell_after_contents =
-                  "'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-";
-
-  const string row_empty_cell =
-"    <CellFill 5>\n\
-     <CellColor `Cyan'>\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellBody'>\n\
-       <ParaLine\n\
-         <String `'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-";
-
-  const string row_after_last_cell =
-"   > # end of Row\n\
-";
-
-
-  const string mif_epilog =
-"  > # end of TblBody\n\
- > # end of Tbl\n\
-> # end of Tbls\n\
-\n\
- <Para\n\
-  <ParaLine\n\
-   <ATbl 1>\n\
-  > # end of ParaLine\n\
- > # end of Para\n\
-\n\
-# End of MIFFile\n\
-";
-
-  int i, j, num_rows, num_cols;
-  string row_ruling;
-  string col_ruling;
-
-  num_rows = sm.numStates();
-  num_cols = sm.numEvents() + 1;
-
-  // -- Prolog
-  out << mif_prolog;
-
-  // -- Table format (for each column)
-  for( i = 0; i < num_cols; i++ )
-  {
-    out << tbl_fmt_before_col_num;
-    out << i;
-    out << tbl_fmt_after_col_num;
-  }
-
-  // -- Spell out width of each column
-
-  // -- FIXME: make following constants into parameters
-  const float total_table_width = 7.5;  // -- Total page width = 7.5" (portrait mode)
-  const float min_col_width = 0.35;     // -- Min col width (for legibility)
-  const float max_col_width = 0.75;     // -- Max col width (for aesthetics)
-  float column_width;
-
-  // -- Calculate column width and clamp it within a range
-  column_width = total_table_width / num_cols;
-  column_width = ((column_width < min_col_width)
-                   ? min_col_width
-                   : ((column_width > max_col_width)
-                      ? max_col_width
-                      : column_width));
-
-  out << tbl_fmt_before_num_cols;
-  out << num_cols;
-  for( i = 0; i < num_cols; i++ )
-  {
-    out << tbl_fmt_each_col_width_begin << column_width << tbl_fmt_each_col_width_end;
-  }
-
-  // -- Column headers
-  out << tbl_before_first_header1;
-  out << formatShorthand( sm.getShorthand() );
-  out << " transitions";
-  out << tbl_before_first_header2;
-
-  out << tbl_before_each_header;
-  out << "State";
-  out << tbl_after_each_header;
-
-  for( i = 0; i < sm.numEvents(); i++ )
-  {
-    out << tbl_before_each_rot_header;
-    out << formatShorthand( sm.getEvent(i).getShorthand() );
-    out << tbl_after_each_header;
-  }
-  out << before_first_row;
-
-
-  // -- Body of table
-  for( i = 0; i < num_rows; i++ )
-  {
-    // -- Each row
-    out << row_before_first_cell;
-
-    // -- Figure out ruling
-    if (sm.getState(i).existPair("format")) {
-      row_ruling = formatCellRuling( sm.getState(i).lookupPair("format"));
-    } else {
-      row_ruling = "";
-    }
-
-    // -- First column = state
-    out << row_cell_before_ruling;
-    out << row_ruling;
-    out << row_cell_before_contents;
-    out << formatShorthand( sm.getState(i).getShorthand() );
-    out << row_cell_after_contents;
-
-    // -- One column for each event
-    for( j = 0; j < sm.numEvents(); j++ )
-    {
-      const Transition* trans_ptr = sm.getTransPtr( i, j );
-
-      // -- Figure out ruling
-      if (sm.getEvent(j).existPair("format")) {
-        col_ruling = formatCellRuling(sm.getEvent(j).lookupPair("format"));
-      } else {
-        col_ruling = "";
-      }
-
-      out << row_cell_before_ruling;
-      out << row_ruling;
-      out << col_ruling;
-
-      if( trans_ptr != NULL )
-      {
-        string actions;
-        string nextState;
-
-        // -- Get the actions
-        actions = formatShorthand( trans_ptr->getActionShorthands() );
-
-        // -- Get the next state
-        // FIXME: should compare index, not the string
-        if (trans_ptr->getNextStateShorthand() !=
-            sm.getState(i).getShorthand() )
-        {
-          nextState = formatShorthand( trans_ptr->getNextStateShorthand() );
-        } else
-        {
-          nextState = "";
-        }
-
-        // -- Print out "actions/next-state"
-        out << row_cell_before_contents;
-        out << actions;
-        if ((nextState.length() != 0) && (actions.length() != 0)) {
-          out << "/";
-        }
-        out << nextState;
-        out << row_cell_after_contents;
-      }
-      else
-      {
-        out << row_empty_cell;
-      }
-
-    }
-
-    out << row_after_last_cell;
-  }
-
-  // -- Epilog
-  out << mif_epilog;
-
-}
-/*
-void printTBETableMIF(const StateMachine& sm, const Vector<Field>& fields, ostream& out)
-{
- const string mif_prolog1 =
-"<MIFFile 5.50> # Generated by Multifacet MIF Mungers Inc\n\
-<Tbls\n\
- <Tbl\n\
-  <TblID 1>\n\
-  <TblTag `Format A'>\n\
-  <TblFormat\n\
-\n\
-   <TblAlignment Center>\n\
-\n\
-   # # <TblXColumnNum 0>\n\
-   <TblXColumnRuling `Medium'>\n\
-\n\
-   <TblLRuling `Medium'>\n\
-   <TblRRuling `Medium'>\n\
-   <TblTRuling `Medium'>\n\
-   <TblBRuling `Medium'>\n\
-\n\
-   <TblColumn\n\
-    <TblColumnNum 0>\n\
-    <TblColumnWidth  0.51\">\n\
-    <TblColumnH\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnH\n\
-    <TblColumnBody\n\
-     <PgfTag `CellBody'>\n\
-    > # end of TblColumnBody\n\
-    <TblColumnF\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnF\n\
-   > # end of TblColumn\n\
-   <TblColumn\n\
-    <TblColumnNum 1>\n\
-    <TblColumnWidth  0.51\">\n\
-    <TblColumnH\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnH\n\
-    <TblColumnBody\n\
-     <PgfTag `CellBody'>\n\
-    > # end of TblColumnBody\n\
-    <TblColumnF\n\
-     <PgfTag `CellHeading'>\n\
-    > # end of TblColumnF\n\
-   > # end of TblColumn\n\
-  > # end of TblFormat\n\
-\n\
-  <TblNumColumns 2>\n\
-  <TblColumnWidth  0.51\">\n\
-  <TblColumnWidth  6.00\">\n\
-  <TblTitle\n\
-   <TblTitleContent\n\
-    <Para\n\
-     <PgfTag `TableTitle'>\n\
-     <Pgf\n\
-      <PgfAlignment Center>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-     > # end of Pgf\n\
-     <PgfNumString `TABLE 1. '>\n\
-     <ParaLine\n\
-      <Marker\n\
-       <MType 9>\n\
-       <MTypeName `Cross-Ref'>\n\
-       <MCurrPage `1'>\n\
-      > # end of Marker\n\
-      <String `";
-
- const string mif_prolog2 =
-   "'>\n\
-     > # end of ParaLine\n\
-    > # end of Para\n\
-   > # end of TblTitleContent\n\
-  > # end of TblTitle\n\
-\n\
-  <TblH\n\
-   <Row\n\
-    <RowMaxHeight  14.0\">\n\
-    <RowHeight  0.44444\">\n\
-    <Cell\n\
-     <CellLRuling `Medium'>\n\
-     <CellBRuling `Medium'>\n\
-     <CellRRuling `Medium'>\n\
-     <CellTRuling `Medium'>\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellHeading'>\n\
-       <Pgf\n\
-        <PgfAlignment Center>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-       >\n\
-       <ParaLine\n\
-        <String `Field'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-    <Cell\n\
-     <CellLRuling `Medium'>\n\
-     <CellBRuling `Medium'>\n\
-     <CellRRuling `Medium'>\n\
-     <CellTRuling `Medium'>\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellHeading'>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-       <ParaLine\n\
-        <String `Description'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-   > # end of Row\n\
-  > # end of TblH\n\
-\n\
-  <TblBody\n\
-";
-
- const string row_before_state =
-" <Row\n\
-    <RowMaxHeight  14.0\">\n\
-    <RowHeight  0.22222\">\n\
-    <Cell\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellBody'>\n\
-       <Pgf\n\
-        <PgfAlignment Center>\n\
-        <PgfFont \n\
-         <FTag `'>\n\
-         <FFamily `Times'>\n\
-         <FVar `Regular'>\n\
-         <FWeight `Regular'>\n\
-         <FAngle `Regular'>\n\
-         <FPostScriptName `Times-Roman'>\n\
-         <FEncoding `FrameRoman'>\n\
-         <FSize  11.0 pt>\n\
-         <FUnderlining FNoUnderlining>\n\
-         <FOverline No>\n\
-         <FStrike No>\n\
-         <FChangeBar No>\n\
-         <FOutline No>\n\
-         <FShadow No>\n\
-         <FPairKern Yes>\n\
-         <FTsume No>\n\
-         <FCase FAsTyped>\n\
-         <FPosition FNormal>\n\
-         <FDX  0.0%>\n\
-         <FDY  0.0%>\n\
-         <FDW  0.0%>\n\
-         <FStretch  100.0%>\n\
-         <FLanguage USEnglish>\n\
-         <FLocked No>\n\
-         <FSeparation 0>\n\
-         <FColor `Black'>\n\
-        > # end of PgfFont\n\
-       >\n\
-       <ParaLine\n\
-         <String `";
-
- const string row_between_state_desc =
-         "'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-    <Cell\n\
-     <CellContent\n\
-      <Para\n\
-       <PgfTag `CellBody'>\n\
-       <ParaLine\n\
-        <String `";
-
- const string row_after_desc =
-        "'>\n\
-       > # end of ParaLine\n\
-      > # end of Para\n\
-     > # end of CellContent\n\
-    > # end of Cell\n\
-   > # end of Row\n\
-";
-
- const string mif_epilog =
-"  > # end of TblBody\n\
- > # end of Tbl\n\
-> # end of Tbls\n\
-\n\
- <Para\n\
-  <ParaLine\n\
-   <ATbl 1>\n\
-  > # end of ParaLine\n\
- > # end of Para\n\
-\n\
-# End of MIFFile\n\
-";
-
- out << mif_prolog1;
- out << sm.getShorthand();
- out << " TBE";
- out << mif_prolog2;
-
- for( int i = 0; i < fields.size(); i++ ) {
-   out << row_before_state;
-   out << formatShorthand(fields[i].getShorthand());
-   out << row_between_state_desc;
-   out << fields[i].getDescription();
-   out << row_after_desc;
- }
-
- out << mif_epilog;
-}
-*/
-// --
-// -- Helper function to do some shorthand formatting (kludge before we
-// -- get the tuple attributes into the state machine language.
-// -- Current convention:
-// --    - each `_' indicates a toggle between normal mode and superscript
-// --    - each escaped (using `\') character indicates a letter formatted
-// --      using the Symbol character set. \a = alpha, \b = beta, \c = chi etc.
-// --      See the FrameMaker character sets manual in the Online Manuals.
-// --    - a `!' indicates extra stuff at the end which can be ignored (used
-// --      for determining cell ruling and so on)
-// --
-string formatShorthand(const string shorthand)
-{
-  string munged_shorthand = "";
-  bool mode_is_normal = true;
-  const string mif_superscript = "'> <Font <FPosition FSuperscript> <FLocked No> > <String `";
-  const string mif_normal = "'> <Font <FPosition FNormal> <FLocked No> > <String `";
-  const string mif_symbol = "'> <Font <FFamily `Symbol'> <FPostScriptName `Symbol'> <FEncoding `FrameRoman'> <FLocked No> > <String `";
-  const string mif_times = "'> <Font <FFamily `Times'> <FPostScriptName `Times-Roman'> <FEncoding `FrameRoman'> <FLocked No> > <String `";
-
-
-  // -- Walk over the string, processing superscript directives
-  for( unsigned int i = 0; i < shorthand.length(); i++ )
-  {
-    if( shorthand[i] == '!' )
-    {
-      // -- Reached logical end of shorthand name
-      break;
-    }
-    else if( shorthand[i] == '^' )
-    {
-      // -- Process super/subscript formatting
-
-      mode_is_normal = !mode_is_normal;
-      if( mode_is_normal )
-      {
-        // -- Back to normal mode
-        munged_shorthand += mif_normal;
-      }
-      else
-      {
-        // -- Going to superscript mode
-        munged_shorthand += mif_superscript;
-      }
-
-    }
-    else if( shorthand[i] == '\\' )
-    {
-      // -- Process Symbol character set
-      if( (i + 1) < shorthand.length() )
-      {
-        i++;  // -- Proceed to next char. Yes I know that changing the loop var is ugly!
-        munged_shorthand += mif_symbol;
-        munged_shorthand += shorthand[i];
-        munged_shorthand += mif_times;
-      }
-      else
-      {
-        // -- FIXME: Add line number info later
-        cerr << "Encountered a `\\` without anything following it!" << endl;
-        exit( -1 );
-      }
-
-    }
-    else
-    {
-      // -- Pass on un-munged
-      munged_shorthand += shorthand[i];
-    }
-
-  } // -- end for all characters in shorthand
-
-  // -- Do any other munging
-
-  // -- Return the formatted shorthand name
-  return munged_shorthand;
-}
-
-
-// --
-// -- Helper function to figure out where to put rules in the table (kludge before we
-// -- get the tuple attributes into the shorthand machine language.
-// -- Current convention:
-// --    - a `!' in the shorthand indicates the beginning of ruling information
-// --    - `b' => bottom of this row is ruled
-// --    - `r' => right of this column is ruled
-// --
-string formatCellRuling( const string shorthand)
-{
-  for( unsigned int i = 0; i < shorthand.length(); i++ )
-  {
-    if( shorthand[i] == '!' )
-    {
-      // -- OK, found beginning of ruling information
-      for( unsigned int j = i+1; j < shorthand.length(); j++ )
-      {
-        if( shorthand[j] == 'b')
-        {
-          // -- Rule the bottom
-          return "<CellBRuling `Medium'>\n";
-        }
-        else if( shorthand[j] == 'r')
-        {
-          // -- Rule the bottom
-          return "<CellRRuling `Medium'>\n";
-        }
-
-      }
-
-      // -- No ruling directives recognized, return default ruling
-      return "";
-    }
-
-  }
-
-  // -- No ruling information found, return default ruling
-  return "";
-}
diff --git a/src/mem/slicc/generator/mif_gen.hh b/src/mem/slicc/generator/mif_gen.hh
deleted file mode 100644
index 6da75f7..0000000
--- a/src/mem/slicc/generator/mif_gen.hh
+++ /dev/null
@@ -1,45 +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: mif_gen.hh,v 3.1 2001/12/12 01:00:35 milo Exp $
- *
- */
-
-#ifndef MIF_GEN_H
-#define MIF_GEN_H
-
-#include "mem/slicc/symbols/StateMachine.hh"
-
-void printStateTableMIF(const StateMachine& sm, ostream& out);
-void printEventTableMIF(const StateMachine& sm, ostream& out);
-void printActionTableMIF(const StateMachine& sm, ostream& out);
-void printTransitionTableMIF(const StateMachine& sm, ostream& out);
-
-#endif //MIF_GEN_H
diff --git a/src/mem/slicc/main.cc b/src/mem/slicc/main.cc
deleted file mode 100644
index 294925e..0000000
--- a/src/mem/slicc/main.cc
+++ /dev/null
@@ -1,246 +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/main.hh"
-#include "mem/slicc/symbols/StateMachine.hh"
-#include "mem/slicc/generator/mif_gen.hh"
-#include "mem/slicc/generator/html_gen.hh"
-#include "mem/slicc/generator/fileio.hh"
-#include "mem/slicc/ast/DeclListAST.hh"
-#include "mem/slicc/symbols/Type.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-#include "mem/slicc/symbols/Event.hh"
-#include "mem/slicc/symbols/State.hh"
-#include "mem/slicc/symbols/Action.hh"
-#include "mem/slicc/symbols/Transition.hh"
-
-// -- Main conversion functions
-
-void printDotty(const StateMachine& sm, ostream& out);
-void printTexTable(const StateMachine& sm, ostream& out);
-
-DeclListAST* g_decl_list_ptr;
-DeclListAST* parse(string filename);
-
-int main(int argc, char *argv[])
-{
-  cerr << "SLICC v0.3" << endl;
-
-  if (argc < 5) {
-    cerr << "  Usage: generator.exec <code path> <html path> <ident> <html direction> files ... " << endl;
-    exit(1);
-  }
-
-  // The path we should place the generated code
-  string code_path(argv[1]);
-  code_path += "/";
-
-  // The path we should place the generated html
-  string html_path(argv[2]);
-  html_path += "/";
-
-  string ident(argv[3]);
-
-  string html_generate(argv[4]);
-
-  Vector<DeclListAST*> decl_list_vec;
-
-  // Parse
-  cerr << "Parsing..." << endl;
-  for(int i=5; i<argc; i++) {
-    cerr << "  " << argv[i] << endl;
-    DeclListAST* decl_list_ptr = parse(argv[i]);
-    decl_list_vec.insertAtBottom(decl_list_ptr);
-  }
-
-  // Find machines
-  cerr << "Generator pass 1..." << endl;
-  int size = decl_list_vec.size();
-  for(int i=0; i<size; i++) {
-    DeclListAST* decl_list_ptr = decl_list_vec[i];
-    decl_list_ptr->findMachines();
-  }
-
-  // Generate Code
-  cerr << "Generator pass 2..." << endl;
-  for(int i=0; i<size; i++) {
-    DeclListAST* decl_list_ptr = decl_list_vec[i];
-    decl_list_ptr->generate();
-    delete decl_list_ptr;
-  }
-
-  // Generate C/C++ files
-  cerr << "Writing C files..." << endl;
-
-  {
-    // Generate the name of the protocol
-    ostringstream sstr;
-    sstr << "// Auto generated C++ code started by "<<__FILE__<<":"<<__LINE__<<endl;
-    sstr << endl;
-    sstr << "#ifndef PROTOCOL_NAME_H" << endl;
-    sstr << "#define PROTOCOL_NAME_H" << endl;
-    sstr << endl;
-    sstr << "const char CURRENT_PROTOCOL[] = \"";
-    sstr << ident << "\";\n";
-    sstr << "#endif // PROTOCOL_NAME_H" << endl;
-    conditionally_write_file(code_path + "/protocol_name.hh", sstr);
-  }
-
-  g_sym_table.writeCFiles(code_path);
-
-  // Generate HTML files
-  if (html_generate == "html") {
-    cerr << "Writing HTML files..." << endl;
-    g_sym_table.writeHTMLFiles(html_path);
-  } else if (html_generate == "no_html") {
-    cerr << "No HTML files generated" << endl;
-  } else {
-    cerr << "ERROR, unidentified html direction" << endl;
-  }
-
-  cerr << "Done..." << endl;
-
-  // Generate MIF files
-  cerr << "Writing MIF files..." << endl;
-  g_sym_table.writeMIFFiles(html_path);
-
-  cerr << "Done..." << endl;
-
-}
-  /*
-  if(!strcmp(argv[2], "parse")) {
-    // Parse only
-  } else if(!strcmp(argv[2], "state")) {
-    printStateTableMIF(s, cout);
-  } else if(!strcmp( argv[2], "event")) {
-    printEventTableMIF(s, cout);
-  } else if(!strcmp( argv[2], "action")) {
-    printActionTableMIF(s, cout);
-  } else if(!strcmp( argv[2], "transition")) {
-    printTransitionTableMIF(s, cout);
-  } else if(!strcmp( argv[2], "tbe")) {
-    for(int i=0; i<s.numTypes(); i++) {
-      if (s.getType(i).getIdent() == "TBE") {
-        printTBETableMIF(s, s.getTypeFields(i), cout);
-      }
-    }
-  } else if(!strcmp( argv[2], "dot")) {
-    printDotty(s, cout);
-  } else if(!strcmp( argv[2], "latex")) {
-    printTexTable(s, cout);
-  } else if (!strcmp( argv[2], "murphi")) {
-    printMurphi(s, cout);
-  } else if (!strcmp( argv[2], "html")) {
-    printHTML(s);
-  } else if(!strcmp( argv[2], "code")) {
-    if (argc < 4) {
-      cerr << "Error: Wrong number of command line parameters!" << endl;
-      exit(1);
-    }
-  */
-
-
-void printDotty(const StateMachine& sm, ostream& out)
-{
-  out << "digraph " << sm.getIdent() << " {" << endl;
-  for(int i=0; i<sm.numTransitions(); i++) {
-    const Transition& t = sm.getTransition(i);
-    // Don't print ignored transitions
-    if ((t.getActionShorthands() != "--") && (t.getActionShorthands() != "z")) {
-    //    if (t.getStateShorthand() != t.getNextStateShorthand()) {
-      out << "  " << t.getStateShorthand() << " -> ";
-      out << t.getNextStateShorthand() << "[label=\"";
-      out << t.getEventShorthand() << "/"
-          << t.getActionShorthands() << "\"]" << endl;
-    }
-  }
-  out << "}" << endl;
-}
-
-void printTexTable(const StateMachine& sm, ostream& out)
-{
-  const Transition* trans_ptr;
-  int stateIndex, eventIndex;
-  string actions;
-  string nextState;
-
-  out << "%& latex" << endl;
-  out << "\\documentclass[12pt]{article}" << endl;
-  out << "\\usepackage{graphics}" << endl;
-  out << "\\begin{document}" << endl;
-  //  out << "{\\large" << endl;
-  out << "\\begin{tabular}{|l||";
-  for(eventIndex=0; eventIndex < sm.numEvents(); eventIndex++) {
-    out << "l";
-  }
-  out << "|} \\hline" << endl;
-
-  for(eventIndex=0; eventIndex < sm.numEvents(); eventIndex++) {
-    out << " & \\rotatebox{90}{";
-    out << sm.getEvent(eventIndex).getShorthand();
-    out << "}";
-  }
-  out << "\\\\ \\hline  \\hline" << endl;
-
-  for(stateIndex=0; stateIndex < sm.numStates(); stateIndex++) {
-    out << sm.getState(stateIndex).getShorthand();
-    for(eventIndex=0; eventIndex < sm.numEvents(); eventIndex++) {
-      out << " & ";
-      trans_ptr = sm.getTransPtr(stateIndex, eventIndex);
-      if (trans_ptr == NULL) {
-      } else {
-        actions = trans_ptr->getActionShorthands();
-        // FIXME: should compare index, not the string
-        if (trans_ptr->getNextStateShorthand() !=
-            sm.getState(stateIndex).getShorthand() ) {
-          nextState = trans_ptr->getNextStateShorthand();
-        } else {
-          nextState = "";
-        }
-
-        out << actions;
-        if ((nextState.length() != 0) && (actions.length() != 0)) {
-          out << "/";
-        }
-        out << nextState;
-      }
-    }
-    out << "\\\\" << endl;
-  }
-  out << "\\hline" << endl;
-  out << "\\end{tabular}" << endl;
-  //  out << "}" << endl;
-  out << "\\end{document}" << endl;
-}
-
diff --git a/src/mem/slicc/main.hh b/src/mem/slicc/main.hh
deleted file mode 100644
index a10dcca..0000000
--- a/src/mem/slicc/main.hh
+++ /dev/null
@@ -1,48 +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.
- */
-
-/*
- * main.hh
- *
- * Description:
- *
- * $Id: main.hh,v 3.2 2003/03/17 01:50:01 xu Exp $
- *
- * */
-
-#ifndef MAIN_H
-#define MAIN_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/ast/DeclListAST.hh"
-#include "mem/gems_common/Map.hh"
-
-extern DeclListAST* g_decl_list_ptr;
-
-#endif //MAIN_H
diff --git a/src/mem/slicc/main.py b/src/mem/slicc/main.py
new file mode 100644
index 0000000..0bc2ef3
--- /dev/null
+++ b/src/mem/slicc/main.py
@@ -0,0 +1,108 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+import os
+import sys
+
+from slicc.parser import SLICC
+
+usage="%prog [options] <files> ... "
+version="%prog v0.4"
+brief_copyright='''
+Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+Copyright (c) 2009 The Hewlett-Packard Development Company
+All Rights Reserved.
+'''
+
+def nprint(format, *args):
+    pass
+
+def eprint(format, *args):
+    if args:
+        format = format % args
+
+    print >>sys.stderr, format
+
+def main(args=None):
+    import optparse
+
+    parser = optparse.OptionParser(usage=usage, version=version,
+                                   description=brief_copyright)
+    parser.add_option("-d", "--debug", default=False, action="store_true",
+                      help="Turn on PLY debugging")
+    parser.add_option("-C", "--code-path", default="generated",
+                      help="Path where C++ code output code goes")
+    parser.add_option("-H", "--html-path",
+                      help="Path where html output goes")
+    parser.add_option("-F", "--print-files",
+                      help="Print files that SLICC will generate")
+    parser.add_option("-q", "--quiet",
+                      help="don't print messages")
+    opts,files = parser.parse_args(args=args)
+
+    if len(files) < 1:
+        parser.print_help()
+        sys.exit(2)
+
+    output = nprint if opts.quiet else eprint
+
+    output("SLICC v0.4")
+    slicc = SLICC(debug=opts.debug)
+
+    output("Parsing...")
+    for filename in slicc.load(files, verbose=True):
+        output("    %s", filename)
+
+    if opts.print_files:
+        hh, cc = slicc.files()
+        hh = sorted(hh)
+        cc = sorted(cc)
+        print 'Headers:'
+        for i in hh:
+            print '    %s' % i
+
+        print 'Sources:'
+        for i in cc:
+            print '    %s' % i
+    else:
+        output("Generator pass 1...")
+        slicc.findMachines()
+
+        output("Generator pass 2...")
+        slicc.generate()
+
+        output("Generating C++ files...")
+        slicc.writeCodeFiles(opts.code_path)
+
+        if opts.html_path:
+            nprint("Writing HTML files...")
+            slicc.writeHTMLFiles(opts.html_path)
+
+    eprint("SLICC is Done.")
+
+if __name__ == "__main__":
+    main()
diff --git a/src/mem/slicc/parser.py b/src/mem/slicc/parser.py
new file mode 100644
index 0000000..0e5ccc8
--- /dev/null
+++ b/src/mem/slicc/parser.py
@@ -0,0 +1,669 @@
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+#
+# Authors: Nathan Binkert
+
+import os.path
+import re
+import sys
+
+from m5.util.grammar import Grammar, TokenError, ParseError
+
+import slicc.ast as ast
+import slicc.util as util
+from slicc.symbols import SymbolTable
+
+def read_slicc(sources):
+    if not isinstance(sources, (list,tuple)):
+        sources = [ sources ]
+
+    for source in sources:
+        for sm_file in file(source, "r"):
+            sm_file = sm_file.strip()
+            if not sm_file:
+                continue
+            if sm_file.startswith("#"):
+                continue
+            yield sm_file
+
+class SLICC(Grammar):
+    def __init__(self, **kwargs):
+        super(SLICC, self).__init__(**kwargs)
+        self.decl_list_vec = []
+        self.current_file = None
+        self.symtab = SymbolTable()
+
+    def parse(self, filename):
+        self.current_file = filename
+        f = file(filename, 'r')
+        text = f.read()
+        try:
+            decl_list = super(SLICC, self).parse(text)
+        except (TokenError, ParseError), e:
+            sys.exit("%s: %s:%d" % (e, filename, e.token.lineno))
+        self.decl_list_vec.append(decl_list)
+        self.current_file = None
+
+    def _load(self, *filenames):
+        filenames = list(filenames)
+        while filenames:
+            f = filenames.pop(0)
+            if isinstance(f, (list, tuple)):
+                filenames[0:0] = list(f)
+                continue
+
+            yield f
+            if f.endswith(".slicc"):
+                dirname,basename = os.path.split(f)
+                filenames[0:0] = [ os.path.join(dirname, x) \
+                                   for x in read_slicc(f)]
+            else:
+                assert f.endswith(".sm")
+                self.parse(f)
+
+    def load(self, *filenames, **kwargs):
+        verbose = kwargs.pop("verbose", False)
+        if kwargs:
+            raise TypeError
+
+        gen = self._load(*filenames)
+        if verbose:
+            return gen
+        else:
+            # Run out the generator if we don't want the verbosity
+            for foo in gen:
+                pass
+
+    def findMachines(self):
+        for decl_list in self.decl_list_vec:
+            decl_list.findMachines()
+
+    def generate(self):
+        for decl_list in self.decl_list_vec:
+            decl_list.generate()
+
+    def writeCodeFiles(self, code_path):
+        util.makeDir(code_path)
+        self.symtab.writeCodeFiles(code_path)
+
+    def writeHTMLFiles(self, code_path):
+        util.makeDir(code_path)
+        self.symtab.writeHTMLFiles(code_path)
+
+    def files(self):
+        cc = set([
+            'ControllerFactory.cc',
+            'MachineType.cc'])
+
+        hh = set([
+            'ControllerFactory.hh',
+            'MachineType.hh',
+            'Types.hh' ])
+
+        for decl_list in self.decl_list_vec:
+            decl_list.files(hh, cc)
+
+        return hh, cc
+
+    t_ignore = '\t '
+
+    # C or C++ comment (ignore)
+    def t_c_comment(self, t):
+        r'/\*(.|\n)*?\*/'
+        t.lexer.lineno += t.value.count('\n')
+
+    def t_cpp_comment(self, t):
+        r'//.*'
+
+    # Define a rule so we can track line numbers
+    def t_newline(self, t):
+        r'\n+'
+        t.lexer.lineno += len(t.value)
+
+    reserved = {
+        'global' : 'GLOBAL',
+        'machine' : 'MACHINE',
+        'in_port' : 'IN_PORT',
+        'out_port' : 'OUT_PORT',
+        'action' : 'ACTION',
+        'transition' : 'TRANS',
+        'structure' : 'STRUCT',
+        'external_type' : 'EXTERN_TYPE',
+        'enumeration' : 'ENUM',
+        'peek' : 'PEEK',
+        'enqueue' : 'ENQUEUE',
+        'copy_head' : 'COPY_HEAD',
+        'check_allocate' : 'CHECK_ALLOCATE',
+        'check_stop_slots' : 'CHECK_STOP_SLOTS',
+        'if' : 'IF',
+        'else' : 'ELSE',
+        'return' : 'RETURN',
+        'THIS' : 'THIS',
+        'CHIP' : 'CHIP',
+        'void' : 'VOID',
+        'new' : 'NEW',
+    }
+
+    literals = ':[]{}(),='
+
+    tokens = [ 'EQ', 'NE', 'LT', 'GT', 'LE', 'GE',
+               'LEFTSHIFT', 'RIGHTSHIFT',
+               'NOT', 'AND', 'OR',
+               'PLUS', 'DASH', 'STAR', 'SLASH',
+               'DOUBLE_COLON', 'SEMI',
+               'ASSIGN', 'DOT',
+               'IDENT', 'LIT_BOOL', 'FLOATNUMBER', 'NUMBER', 'STRING' ]
+    tokens += reserved.values()
+
+    t_EQ = r'=='
+    t_NE = r'!='
+    t_LT = r'<'
+    t_GT = r'>'
+    t_LE = r'<='
+    t_GE = r'>='
+    t_LEFTSHIFT = r'<<'
+    t_RIGHTSHIFT = r'>>'
+    t_NOT = r'!'
+    t_AND = r'&&'
+    t_OR = r'\|\|'
+    t_PLUS = r'\+'
+    t_DASH = r'-'
+    t_STAR = r'\*'
+    t_SLASH = r'/'
+    t_DOUBLE_COLON = r'::'
+    t_SEMI = r';'
+    t_ASSIGN = r':='
+    t_DOT = r'\.'
+
+    precedence = (
+        ('left', 'AND', 'OR'),
+        ('left', 'EQ', 'NE'),
+        ('left', 'LT', 'GT', 'LE', 'GE'),
+        ('left', 'RIGHTSHIFT', 'LEFTSHIFT'),
+        ('left', 'PLUS', 'DASH'),
+        ('left', 'STAR', 'SLASH'),
+        ('right', 'NOT', 'UMINUS'),
+    )
+
+    def t_IDENT(self, t):
+        r'[a-zA-Z_][a-zA-Z_0-9]*'
+        if t.value == 'true':
+            t.type = 'LIT_BOOL'
+            t.value = True
+            return t
+
+        if t.value == 'false':
+            t.type = 'LIT_BOOL'
+            t.value = False
+            return t
+
+        # Check for reserved words
+        t.type = self.reserved.get(t.value, 'IDENT')
+        return t
+
+    def t_FLOATNUMBER(self, t):
+        '[0-9]+[.][0-9]+'
+        try:
+            t.value = float(t.value)
+        except ValueError:
+            raise TokenError("Illegal float", t)
+        return t
+
+    def t_NUMBER(self, t):
+        r'[0-9]+'
+        try:
+            t.value = int(t.value)
+        except ValueError:
+            raise TokenError("Illegal number", t)
+        return t
+
+    def t_STRING1(self, t):
+        r'\"[^"\n]*\"'
+        t.type = 'STRING'
+        t.value = t.value[1:-1]
+        return t
+
+    def t_STRING2(self, t):
+        r"\'[^'\n]*\'"
+        t.type = 'STRING'
+        t.value = t.value[1:-1]
+        return t
+
+    def p_file(self, p):
+        "file : decls"
+        p[0] = p[1]
+
+    def p_empty(self, p):
+        "empty :"
+
+    def p_decls(self, p):
+        "decls : declsx"
+        p[0] = ast.DeclListAST(self, p[1])
+
+    def p_declsx__list(self, p):
+        "declsx : decl declsx"
+        p[0] = [ p[1] ] + p[2]
+
+    def p_declsx__none(self, p):
+        "declsx : empty"
+        p[0] = []
+
+    def p_decl__machine(self, p):
+        "decl : MACHINE '(' ident pairs ')' ':' params '{' decls '}'"
+        p[0] = ast.MachineAST(self, p[3], p[4], p[7], p[9])
+
+    def p_decl__action(self, p):
+        "decl : ACTION '(' ident pairs ')' statements"
+        p[0] = ast.ActionDeclAST(self, p[3], p[4], p[6])
+
+    def p_decl__in_port(self, p):
+        "decl : IN_PORT '(' ident ',' type ',' var pairs ')' statements"
+        p[0] = ast.InPortDeclAST(self, p[3], p[5], p[7], p[8], p[10])
+
+    def p_decl__out_port(self, p):
+        "decl : OUT_PORT '(' ident ',' type ',' var pairs ')' SEMI"
+        p[0] = ast.OutPortDeclAST(self, p[3], p[5], p[7], p[8])
+
+    def p_decl__trans0(self, p):
+        "decl : TRANS '(' idents ',' idents ',' ident pairs ')' idents"
+        p[0] = ast.TransitionDeclAST(self, p[3], p[5], p[7], p[8], p[10])
+
+    def p_decl__trans1(self, p):
+        "decl : TRANS '(' idents ',' idents           pairs ')' idents"
+        p[0] = ast.TransitionDeclAST(self, p[3], p[5], None, p[6], p[8])
+
+    def p_decl__extern0(self, p):
+        "decl : EXTERN_TYPE '(' type pairs ')' SEMI"
+        p[4]["external"] = "yes"
+        p[0] = ast.TypeDeclAST(self, p[3], p[4], [])
+
+    def p_decl__extern1(self, p):
+        "decl : EXTERN_TYPE '(' type pairs ')' '{' type_methods '}'"
+        p[4]["external"] = "yes"
+        p[0] = ast.TypeDeclAST(self, p[3], p[4], p[7])
+
+    def p_decl__global(self, p):
+        "decl : GLOBAL '(' type pairs ')' '{' type_members '}'"
+        p[4]["global"] = "yes"
+        p[0] = ast.TypeDeclAST(self, p[3], p[4], p[7])
+
+    def p_decl__struct(self, p):
+        "decl : STRUCT '(' type pairs ')' '{' type_members '}'"
+        p[0] = ast.TypeDeclAST(self, p[3], p[4], p[7])
+
+    def p_decl__enum(self, p):
+        "decl : ENUM '(' type pairs ')' '{' type_enums   '}'"
+        p[4]["enumeration"] = "yes"
+        p[0] = ast.EnumDeclAST(self, p[3], p[4], p[7])
+
+    def p_decl__object(self, p):
+        "decl : type ident pairs SEMI"
+        p[0] = ast.ObjDeclAST(self, p[1], p[2], p[3])
+
+    def p_decl__func_decl(self, p):
+        """decl : void ident '(' params ')' pairs SEMI
+                | type ident '(' params ')' pairs SEMI"""
+        p[0] = ast.FuncDeclAST(self, p[1], p[2], p[4], p[6], None)
+
+    def p_decl__func_def(self, p):
+        """decl : void ident '(' params ')' pairs statements
+                | type ident '(' params ')' pairs statements"""
+        p[0] = ast.FuncDeclAST(self, p[1], p[2], p[4], p[6], p[7])
+
+    # Type fields
+    def p_type_members__list(self, p):
+        "type_members : type_member type_members"
+        p[0] = [ p[1] ] + p[2]
+
+    def p_type_members__empty(self, p):
+        "type_members : empty"
+        p[0] = []
+
+    def p_type_member__1(self, p):
+        "type_member : type ident pairs SEMI"
+        p[0] = ast.TypeFieldMemberAST(self, p[1], p[2], p[3], None)
+
+    def p_type_member__2(self, p):
+        "type_member : type ident ASSIGN expr SEMI"
+        p[0] = ast.TypeFieldMemberAST(self, p[1], p[2],
+                                      ast.PairListAST(self), p[4])
+
+    # Methods
+    def p_type_methods__list(self, p):
+        "type_methods : type_method type_methods"
+        p[0] = [ p[1] ] + p[2]
+
+    def p_type_methods(self, p):
+        "type_methods : empty"
+        p[0] = []
+
+    def p_type_method(self, p):
+        "type_method : type_or_void ident '(' types ')' pairs SEMI"
+        p[0] = ast.TypeFieldMethodAST(self, p[1], p[2], p[4], p[6])
+
+    # Enum fields
+    def p_type_enums__list(self, p):
+        "type_enums : type_enum type_enums"
+        p[0] = [ p[1] ] + p[2]
+
+    def p_type_enums__empty(self, p):
+        "type_enums : empty"
+        p[0] = []
+
+    def p_type_enum(self, p):
+        "type_enum : ident pairs SEMI"
+        p[0] = ast.TypeFieldEnumAST(self, p[1], p[2])
+
+    # Type
+    def p_types__multiple(self, p):
+        "types : type ',' types"
+        p[0] = [ p[1] ] + p[3]
+
+    def p_types__one(self, p):
+        "types : type"
+        p[0] = [ p[1] ]
+
+    def p_types__empty(self, p):
+        "types : empty"
+        p[0] = []
+
+    def p_type(self, p):
+        "type : ident"
+        p[0] = ast.TypeAST(self, p[1])
+
+    def p_void(self, p):
+        "void : VOID"
+        p[0] = ast.TypeAST(self, p[1])
+
+    def p_type_or_void(self, p):
+        """type_or_void : type
+                        | void"""
+        p[0] = p[1]
+
+    # Formal Param
+    def p_params__many(self, p):
+        "params : param ',' params"
+        p[0] = [ p[1] ] + p[3]
+
+    def p_params__one(self, p):
+        "params : param"
+        p[0] = [ p[1] ]
+
+    def p_params__none(self, p):
+        "params : empty"
+        p[0] = []
+
+    def p_param(self, p):
+        "param : type ident"
+        p[0] = ast.FormalParamAST(self, p[1], p[2])
+
+    # Idents and lists
+    def p_idents__braced(self, p):
+        "idents : '{' identx '}'"
+        p[0] = p[2]
+
+    def p_idents__bare(self, p):
+        "idents : ident"
+        p[0] = [ p[1] ]
+
+    def p_identx__multiple_1(self, p):
+        """identx : ident SEMI identx
+                  | ident ',' identx"""
+        p[0] = [ p[1] ] + p[3]
+
+    def p_identx__multiple_2(self, p):
+        "identx : ident identx"
+        p[0] = [ p[1] ] + p[2]
+
+    def p_identx__single(self, p):
+        "identx : empty"
+        p[0] = [ ]
+
+    def p_ident(self, p):
+        "ident : IDENT"
+        p[0] = p[1]
+
+    # Pair and pair lists
+    def p_pairs__list(self, p):
+        "pairs : ',' pairsx"
+        p[0] = p[2]
+
+    def p_pairs__empty(self, p):
+        "pairs : empty"
+        p[0] = ast.PairListAST(self)
+
+    def p_pairsx__many(self, p):
+        "pairsx : pair ',' pairsx"
+        p[0] = p[3]
+        p[0].addPair(p[1])
+
+    def p_pairsx__one(self, p):
+        "pairsx : pair"
+        p[0] = ast.PairListAST(self)
+        p[0].addPair(p[1])
+
+    def p_pair__assign(self, p):
+        """pair : ident '=' STRING
+                | ident '=' ident"""
+        p[0] = ast.PairAST(self, p[1], p[3])
+
+    def p_pair__literal(self, p):
+        "pair : STRING"
+        p[0] = ast.PairAST(self, "short", p[1])
+
+    # Below are the rules for action descriptions
+    def p_statements__inner(self, p):
+        "statements : '{' statements_inner '}'"
+        p[0] = ast.StatementListAST(self, p[2])
+
+    def p_statements__none(self, p):
+        "statements : '{' '}'"
+        p[0] = ast.StatementListAST(self, [])
+
+    def p_statements_inner__many(self, p):
+        "statements_inner : statement statements_inner"
+        p[0] = [ p[1] ] + p[2]
+
+    def p_statements_inner__one(self, p):
+        "statements_inner : statement"
+        p[0] = [ p[1] ]
+
+    def p_exprs__multiple(self, p):
+        "exprs : expr ',' exprs"
+        p[0] = [ p[1] ] + p[3]
+
+    def p_exprs__one(self, p):
+        "exprs : expr"
+        p[0] = [ p[1] ]
+
+    def p_exprs__empty(self, p):
+        "exprs : empty"""
+        p[0] = []
+
+    def p_statement__expression(self, p):
+        "statement : expr SEMI"
+        p[0] = ast.ExprStatementAST(self, p[1])
+
+    def p_statement__assign(self, p):
+        "statement : expr ASSIGN expr SEMI"
+        p[0] = ast.AssignStatementAST(self, p[1], p[3])
+
+    def p_statement__enqueue(self, p):
+        "statement : ENQUEUE '(' var ',' type pairs ')' statements"
+        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")
+
+    def p_statement__copy_head(self, p):
+        "statement : COPY_HEAD '(' var ',' var pairs ')' SEMI"
+        p[0] = ast.CopyHeadStatementAST(self, p[3], p[5], p[6])
+
+    def p_statement__check_allocate(self, p):
+        "statement : CHECK_ALLOCATE '(' var ')' SEMI"
+        p[0] = ast.CheckAllocateStatementAST(self, p[3])
+
+    def p_statement__check_stop(self, p):
+        "statement : CHECK_STOP_SLOTS '(' var ',' STRING ',' STRING ')' SEMI"
+        p[0] = ast.CheckStopStatementAST(self, p[3], p[5], p[7])
+
+    def p_statement__return(self, p):
+        "statement : RETURN expr SEMI"
+        p[0] = ast.ReturnStatementAST(self, p[2])
+
+    def p_statement__if(self, p):
+        "statement : if_statement"
+        p[0] = p[1]
+
+    def p_if_statement__if(self, p):
+        "if_statement : IF '(' expr ')' statements"
+        p[0] = ast.IfStatementAST(self, p[3], p[5], None)
+
+    def p_if_statement__if_else(self, p):
+        "if_statement : IF '(' expr ')' statements ELSE statements"
+        p[0] = ast.IfStatementAST(self, p[3], p[5], p[7])
+
+    def p_statement__if_else_if(self, p):
+        "if_statement : IF '(' expr ')' statements ELSE if_statement"
+        p[0] = ast.IfStatementAST(self, p[3], p[5],
+                                  ast.StatementListAST(self, p[7]))
+
+    def p_expr__var(self, p):
+        "aexpr : var"
+        p[0] = p[1]
+
+    def p_expr__literal(self, p):
+        "aexpr : literal"
+        p[0] = p[1]
+
+    def p_expr__enumeration(self, p):
+        "aexpr : enumeration"
+        p[0] = p[1]
+
+    def p_expr__func_call(self, p):
+        "aexpr : ident '(' exprs ')'"
+        p[0] = ast.FuncCallExprAST(self, p[1], p[3])
+
+    def p_expr__new(self, p):
+        "aexpr : NEW type"
+        p[0] = ast.NewExprAST(self, p[2])
+
+    # globally access a local chip component and call a method
+    def p_expr__local_chip_method(self, p):
+        "aexpr : THIS DOT var '[' expr ']' DOT var DOT ident '(' exprs ')'"
+        p[0] = ast.LocalChipMethodAST(self, p[3], p[5], p[8], p[10], p[12])
+
+    # globally access a local chip component and access a data member
+    def p_expr__local_chip_member(self, p):
+        "aexpr : THIS DOT var '[' expr ']' DOT var DOT field"
+        p[0] = ast.LocalChipMemberAST(self, p[3], p[5], p[8], p[10])
+
+    # globally access a specified chip component and call a method
+    def p_expr__specified_chip_method(self, p):
+        "aexpr : CHIP '[' expr ']' DOT var '[' expr ']' DOT var DOT ident '(' exprs ')'"
+        p[0] = ast.SpecifiedChipMethodAST(self, p[3], p[6], p[8], p[11], p[13],
+                                          p[15])
+
+    # globally access a specified chip component and access a data member
+    def p_expr__specified_chip_member(self, p):
+        "aexpr : CHIP '[' expr ']' DOT var '[' expr ']' DOT var DOT field"
+        p[0] = ast.SpecifiedChipMemberAST(self, p[3], p[6], p[8], p[11], p[13])
+
+    def p_expr__member(self, p):
+        "aexpr : aexpr DOT ident"
+        p[0] = ast.MemberExprAST(self, p[1], p[3])
+
+    def p_expr__member_method_call(self, p):
+        "aexpr : aexpr DOT ident '(' exprs ')'"
+        p[0] = ast.MemberMethodCallExprAST(self, p[1], p[3], p[5])
+
+    def p_expr__member_method_call_lookup(self, p):
+        "aexpr : aexpr '[' exprs ']'"
+        p[0] = ast.MemberMethodCallExprAST(self, p[1], "lookup", p[3])
+
+    def p_expr__class_method_call(self, p):
+        "aexpr : type DOUBLE_COLON ident '(' exprs ')'"
+        p[0] = ast.ClassMethodCallExprAST(self, p[1], p[3], p[5])
+
+    def p_expr__aexpr(self, p):
+        "expr : aexpr"
+        p[0] = p[1]
+
+    def p_expr__binary_op(self, p):
+        """expr : expr STAR  expr
+                | expr SLASH expr
+                | expr PLUS  expr
+                | expr DASH  expr
+                | expr LT    expr
+                | expr GT    expr
+                | expr LE    expr
+                | expr GE    expr
+                | expr EQ    expr
+                | expr NE    expr
+                | expr AND   expr
+                | expr OR    expr
+                | expr RIGHTSHIFT expr
+                | expr LEFTSHIFT  expr"""
+        p[0] = ast.InfixOperatorExprAST(self, p[1], p[2], p[3])
+
+    # FIXME - unary not
+    def p_expr__unary_op(self, p):
+        """expr : NOT expr
+                | DASH expr %prec UMINUS"""
+        p[0] = PrefixOperatorExpr(p[1], p[2])
+
+    def p_expr__parens(self, p):
+        "aexpr : '(' expr ')'"
+        p[0] = p[2]
+
+    def p_literal__string(self, p):
+        "literal : STRING"
+        p[0] = ast.LiteralExprAST(self, p[1], "string")
+
+    def p_literal__number(self, p):
+        "literal : NUMBER"
+        p[0] = ast.LiteralExprAST(self, p[1], "int")
+
+    def p_literal__float(self, p):
+        "literal : FLOATNUMBER"
+        p[0] = ast.LiteralExprAST(self, p[1], "int")
+
+    def p_literal__bool(self, p):
+        "literal : LIT_BOOL"
+        p[0] = ast.LiteralExprAST(self, p[1], "bool")
+
+    def p_enumeration(self, p):
+        "enumeration : ident ':' ident"
+        p[0] = ast.EnumExprAST(self, ast.TypeAST(self, p[1]), p[3])
+
+    def p_var(self, p):
+        "var : ident"
+        p[0] = ast.VarExprAST(self, p[1])
+
+    def p_field(self, p):
+        "field : ident"
+        p[0] = p[1]
diff --git a/src/mem/slicc/parser/lexer.ll b/src/mem/slicc/parser/lexer.ll
deleted file mode 100644
index b2d3685..0000000
--- a/src/mem/slicc/parser/lexer.ll
+++ /dev/null
@@ -1,125 +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 <assert.h>
-#include "mem/slicc/ast/ASTs.hh"
-#include "parser.hh"
-#include <string>
-
-extern "C" int yylex();
-extern "C" void yyerror();
-extern "C" int yywrap()
-{
-    return 1;
-}
-
-%}
-%x CMNT
-%x IMBEDED
-%%
-
-[\t ]+   /* Ignore whitespace */
-[\n]       { g_line_number++; }
-"//".*[\n] { g_line_number++; }  /* C++ style comments */
-
-"/*" BEGIN CMNT;
-<CMNT>. ;
-<CMNT>\n { g_line_number++; }
-<CMNT>"*/" { BEGIN INITIAL; }
-
-true       { yylval.str_ptr = new string(yytext); return LIT_BOOL; }
-false      { yylval.str_ptr = new string(yytext); return LIT_BOOL; }
-global     { return GLOBAL_DECL; }
-machine    { return MACHINE_DECL; }
-in_port    { return IN_PORT_DECL; }
-out_port   { return OUT_PORT_DECL; }
-action     { return ACTION_DECL; }
-transition { return TRANSITION_DECL; }
-structure  { return STRUCT_DECL; }
-external_type { return EXTERN_TYPE_DECL; }
-enumeration { return ENUM_DECL; }
-peek       { return PEEK; }
-enqueue    { return ENQUEUE; }
-copy_head  { return COPY_HEAD; }
-check_allocate  { return CHECK_ALLOCATE; }
-check_stop_slots  { return CHECK_STOP_SLOTS; }
-if         { return IF; }
-else       { return ELSE; }
-return     { return RETURN; }
-THIS       { return THIS; }
-CHIP       { return CHIP; }
-void       { yylval.str_ptr = new string(yytext); return VOID; }
-new        { return NEW; }
-
-==        { yylval.str_ptr = new string(yytext); return EQ; }
-!=        { yylval.str_ptr = new string(yytext); return NE; }
-[<]       { yylval.str_ptr = new string(yytext); return '<'; }
-[>]       { yylval.str_ptr = new string(yytext); return '>'; }
-[<][<]    { yylval.str_ptr = new string(yytext); return LEFTSHIFT; }
-[>][>]    { yylval.str_ptr = new string(yytext); return RIGHTSHIFT; }
-[<][=]    { yylval.str_ptr = new string(yytext); return LE; }
-[>][=]    { yylval.str_ptr = new string(yytext); return GE; }
-[!]       { yylval.str_ptr = new string(yytext); return NOT; }
-[&][&]    { yylval.str_ptr = new string(yytext); return AND; }
-[|][|]    { yylval.str_ptr = new string(yytext); return OR; }
-[+]       { yylval.str_ptr = new string(yytext); return PLUS; }
-[-]       { yylval.str_ptr = new string(yytext); return DASH; }
-[*]       { yylval.str_ptr = new string(yytext); return STAR; }
-[/]       { yylval.str_ptr = new string(yytext); return SLASH; }
-::        { return DOUBLE_COLON; }
-[:]       { return ':'; }
-[;]       { return SEMICOLON; }
-[[]       { return '['; }
-[]]       { return ']'; }
-[{]       { return '{'; }
-[}]       { return '}'; }
-[(]       { return '('; }
-[)]       { return ')'; }
-[,]       { return ','; }
-[=]       { return '='; }
-:=        { return ASSIGN; }
-[.]       { return DOT; }
-
-[0-9]*[.][0-9]*     { yylval.str_ptr = new string(yytext); return FLOATNUMBER; }
-[0-9]*     { yylval.str_ptr = new string(yytext); return NUMBER; }
-
-[a-zA-Z_][a-zA-Z_0-9]{0,50}    { yylval.str_ptr = new string(yytext); return IDENT; }
-\"[^"\n]*\"  { yytext[strlen(yytext)-1] = '\0';  yylval.str_ptr = new string(yytext+1); return STRING; }
-\'[^'\n]*\'  { yytext[strlen(yytext)-1] = '\0';  yylval.str_ptr = new string(yytext+1); return STRING; }
-
-.         { return OTHER; }  /* Need so that we handle all characters */
-
-%%
-
diff --git a/src/mem/slicc/parser/parser.py b/src/mem/slicc/parser/parser.py
deleted file mode 100644
index 7fecfd2..0000000
--- a/src/mem/slicc/parser/parser.py
+++ /dev/null
@@ -1,563 +0,0 @@
-# Copyright (c) 2009 The Hewlett-Packard Development Company
-# 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.
-#
-# Authors: Nathan Binkert
-
-from ply import lex, yacc
-import re
-
-t_ignore = '\t '
-
-# C or C++ comment (ignore)
-def t_c_comment(t):
-    r'/\*(.|\n)*?\*/'
-    t.lexer.lineno += t.value.count('\n')
-
-def t_cpp_comment(t):
-    r'//.*'
-    pass
-
-# Define a rule so we can track line numbers
-def t_newline(t):
-    r'\n+'
-    t.lexer.lineno += len(t.value)
-
-reserved = {
-    'global' : 'GLOBAL',
-    'machine' : 'MACHINE',
-    'in_port' : 'IN_PORT',
-    'out_port' : 'OUT_PORT',
-    'action' : 'ACTION',
-    'transition' : 'TRANS',
-    'structure' : 'STRUCT',
-    'external_type' : 'EXTERN_TYPE',
-    'enumeration' : 'ENUM',
-    'peek' : 'PEEK',
-    'enqueue' : 'ENQUEUE',
-    'copy_head' : 'COPY_HEAD',
-    'check_allocate' : 'CHECK_ALLOCATE',
-    'check_stop_slots' : 'CHECK_STOP_SLOTS',
-    'if' : 'IF',
-    'else' : 'ELSE',
-    'return' : 'RETURN',
-    'THIS' : 'THIS',
-    'CHIP' : 'CHIP',
-    'void' : 'VOID',
-    'new' : 'NEW',
-}
-
-literals = ':[]{}(),='
-
-tokens = [ 'EQ', 'NE', 'LT', 'GT', 'LE', 'GE',
-           'LEFTSHIFT', 'RIGHTSHIFT',
-           'NOT', 'AND', 'OR',
-           'PLUS', 'DASH', 'STAR', 'SLASH',
-           'DOUBLE_COLON', 'SEMICOLON',
-           'ASSIGN', 'DOT',
-           'IDENT', 'LIT_BOOL', 'FLOATNUMBER', 'NUMBER', 'STRING' ]
-tokens += reserved.values()
-
-t_EQ = r'=='
-t_NE = r'!='
-t_LT = r'<'
-t_GT = r'>'
-t_LE = r'<='
-t_GE = r'>='
-t_LEFTSHIFT = r'<<'
-t_RIGHTSHIFT = r'>>'
-t_NOT = r'!'
-t_AND = r'&&'
-t_OR = r'\|\|'
-t_PLUS = r'\+'
-t_DASH = r'-'
-t_STAR = r'\*'
-t_SLASH = r'/'
-t_DOUBLE_COLON = r'::'
-t_SEMICOLON = r';'
-t_ASSIGN = r':='
-t_DOT = r'\.'
-
-class TokenError(Exception):
-    def __init__(self, msg, t):
-        super(TokenError, self).__init__(msg)
-        self.token = t
-
-class ParseError(Exception):
-    def __init__(self, msg, t):
-        super(ParseError, self).__init__(msg)
-        self.token = t
-
-def t_error(t):
-    raise TokenError("Illegal character", t)
-
-def t_IDENT(t):
-    r'[a-zA-Z_][a-zA-Z_0-9]*'
-    if t.value == 'true':
-        t.type = 'LIT_BOOL'
-        t.value = True
-        return t
-
-    if t.value == 'false':
-        t.type = 'LIT_BOOL'
-        t.value = False
-        return t
-
-    if t.value.startswith('LATENCY_'):
-        t.type = 'LATENCY'
-        return t
-
-    t.type = reserved.get(t.value, 'IDENT')    # Check for reserved words
-    return t
-
-def t_FLOATNUMBER(t):
-    '[0-9]+[.][0-9]+'
-    try:
-        t.value = float(t.value)
-    except ValueError:
-        raise TokenError("Illegal float", t)
-    return t
-
-def t_NUMBER(t):
-    r'[0-9]+'
-    try:
-        t.value = int(t.value)
-    except ValueError:
-        raise TokenError("Illegal number", t)
-    return t
-
-def t_STRING1(t):
-    r'\"[^"\n]*\"'
-    t.type = 'STRING'
-    return t
-
-def t_STRING2(t):
-    r"\'[^'\n]*\'"
-    t.type = 'STRING'
-    return t
-
-
-def p_file(p):
-    "file : decl_l"
-    p[0] = [ x for x in p[1] if x is not None ]
-
-def p_error(t):
-    raise ParseError("Syntax error", t)
-
-def p_empty(p):
-    "empty :"
-    pass
-
-def p_decl_l(p):
-    "decl_l : decls"
-    p[0] = p[1]
-
-def p_decls(p):
-    """decls : decl decls
-             | empty"""
-    if len(p) == 3:
-        p[0] = [ p[1] ] + p[2]
-    elif len(p) == 2:
-        p[0] = []
-
-def p_decl(p):
-    """decl : d_machine
-            | d_action
-            | d_in_port
-            | d_out_port
-            | t_trans
-            | d_extern
-            | d_global
-            | d_struct
-            | d_enum
-            | d_object
-            | d_func_decl
-            | d_func_def"""
-    p[0] = p[1]
-
-def p_d_machine(p):
-    """d_machine : MACHINE '(' ident pair_l ')' ':' param_l '{' decl_l '}'"""
-
-    if len(p) == 9:
-        decl_l = p[7]
-    elif len(p) == 11:
-        decl_l = p[9]
-    decls = [ x for x in decl_l if x is not None ]
-    p[0] = Machine(p[3], decls)
-
-def p_d_action(p):
-    "d_action : ACTION '(' ident pair_l ')' statement_l"
-    p[0] = Action(p[3])
-
-def p_d_in_port(p):
-    "d_in_port : IN_PORT '(' ident ',' type ',' var pair_l ')' statement_l"
-    p[0] = InPort(p[3])
-
-def p_d_out_port(p):
-    "d_out_port : OUT_PORT '(' ident ',' type ',' var pair_l ')' SEMICOLON"
-    p[0] = OutPort(p[3])
-
-def p_t_trans(p):
-    """t_trans : TRANS '(' ident_l ',' ident_l ',' ident pair_l ')' ident_l
-               | TRANS '(' ident_l ',' ident_l           pair_l ')' ident_l"""
-    p[0] = Transition("transition")
-
-def p_d_extern(p):
-    """d_extern : EXTERN_TYPE '(' type pair_l ')' SEMICOLON
-                | EXTERN_TYPE '(' type pair_l ')' '{' type_methods '}'"""
-    p[0] = Extern(p[3])
-
-def p_d_global(p):
-    "d_global : GLOBAL '(' type pair_l ')' '{' type_members '}'"
-    p[0] = Global(p[3])
-
-def p_d_struct(p):
-    "d_struct : STRUCT '(' type pair_l ')' '{' type_members '}'"
-    p[0] = Struct(p[3])
-
-def p_d_enum(p):
-    "d_enum : ENUM '(' type pair_l ')' '{' type_enums   '}'"
-    p[0] = Enum(p[3])
-
-def p_d_object(p):
-    "d_object : type ident pair_l SEMICOLON"
-    p[0] = Object(p[2])
-
-def p_d_func_decl(p):
-    """d_func_decl : void ident '(' param_l ')' pair_l SEMICOLON
-                   | type ident '(' param_l ')' pair_l SEMICOLON"""
-    pass
-
-def p_d_func_def(p):
-    """d_func_def : void ident '(' param_l ')' pair_l statement_l
-                  | type ident '(' param_l ')' pair_l statement_l"""
-    p[0] = Function(p[2])
-
-# Type fields
-def p_type_members(p):
-    """type_members : type_member type_members
-                    | empty"""
-    pass
-
-def p_type_member(p):
-    """type_member : type ident pair_l SEMICOLON
-                   | type ident ASSIGN expr SEMICOLON"""
-    pass
-
-# Methods
-def p_type_methods(p):
-    """type_methods : type_method type_methods
-                    | empty"""
-    pass
-
-def p_type_method(p):
-    "type_method : type_or_void ident '(' type_l ')' pair_l SEMICOLON"
-    pass
-
-# Enum fields
-def p_type_enums(p):
-    """type_enums : type_enum type_enums
-                  | empty"""
-    pass
-
-def p_type_enum(p):
-    "type_enum : ident pair_l SEMICOLON"
-    pass
-
-# Type
-def p_type_l(p):
-    """type_l : types
-                 | empty"""
-    pass
-
-def p_types(p):
-    """types : type ',' types
-             | type"""
-    pass
-
-def p_type(p):
-    "type : ident"
-    p[0] = p[1]
-
-def p_void(p):
-    "void : VOID"
-    p[0] = None
-
-def p_type_or_void(p):
-    """type_or_void : type
-                    | void"""
-    p[0] = p[1]
-
-# Formal Param
-def p_param_l(p):
-    """param_l : params
-               | empty"""
-    pass
-
-def p_params(p):
-    """params : param ',' params
-              | param"""
-    pass
-
-def p_param(p):
-    "param : type ident"
-    pass
-
-# Idents and lists
-def p_ident(p):
-    "ident : IDENT"
-    p[0] = p[1]
-
-def p_ident_l(p):
-    """ident_l : '{' idents '}'
-                  | ident"""
-    p[0] = p[1]
-
-def p_idents(p):
-    """idents : ident SEMICOLON idents
-              | ident ',' idents
-              | ident idents
-              | empty"""
-    pass
-
-# Pair and pair lists
-def p_pair_l(p):
-    """pair_l : ',' pairs
-                 | empty"""
-    if len(p) == 3:
-        p[0] = p[2]
-    elif len(p) == 2:
-        p[0] = None
-
-def p_pairs(p):
-    """pairs : pair ',' pairs
-             | pair"""
-    if len(p) == 4:
-        p[3].append(p[1])
-        p[0] = p[3]
-    elif len(p) == 2:
-        p[0] = [ p[1] ]
-
-def p_pair(p):
-    """pair : ident '=' STRING
-            | ident '=' ident
-            | STRING"""
-    if len(p) == 4:
-        p[0] = p[1], p[3]
-    elif len(p) == 2:
-        p[0] = "short", p[1]
-
-# Below are the rules for action descriptions
-def p_statement_l(p):
-    "statement_l : '{' statements '}'"
-    pass
-
-def p_statements(p):
-    """statements : statement statements
-                  | empty"""
-    pass
-
-def p_expr_l(p):
-    """expr_l : expr ',' expr_l
-                 | expr
-                 | empty"""
-    pass
-
-def p_statement(p):
-    """statement : expr SEMICOLON
-                 | expr ASSIGN expr SEMICOLON
-                 | ENQUEUE '(' var ',' type pair_l ')' statement_l
-                 | PEEK '(' var ',' type ')' statement_l
-                 | COPY_HEAD '(' var ',' var pair_l ')' SEMICOLON
-                 | CHECK_ALLOCATE '(' var ')' SEMICOLON
-                 | CHECK_STOP_SLOTS '(' var ',' STRING ',' STRING ')' SEMICOLON
-                 | if_statement
-                 | RETURN expr SEMICOLON"""
-    pass
-
-def p_if_statement(p):
-    """if_statement : IF '(' expr ')' statement_l ELSE statement_l
-                    | IF '(' expr ')' statement_l
-                    | IF '(' expr ')' statement_l ELSE if_statement"""
-    pass
-
-def p_expr(p):
-    """expr :  var
-            | literal
-            | enumeration
-            | ident '(' expr_l ')'
-            | NEW type
-            | THIS DOT var '[' expr ']' DOT var DOT ident '(' expr_l ')'
-            | THIS DOT var '[' expr ']' DOT var DOT ident
-            | CHIP '[' expr ']' DOT var '[' expr ']' DOT var DOT ident '(' expr_l ')'
-            | CHIP '[' expr ']' DOT var '[' expr ']' DOT var DOT ident
-            | expr DOT ident
-            | expr DOT ident '(' expr_l ')'
-            | type DOUBLE_COLON ident '(' expr_l ')'
-            | expr '[' expr_l ']'
-            | expr STAR  expr
-            | expr SLASH expr
-            | expr PLUS  expr
-            | expr DASH  expr
-            | expr LT    expr
-            | expr GT    expr
-            | expr LE    expr
-            | expr GE    expr
-            | expr EQ    expr
-            | expr NE    expr
-            | expr AND   expr
-            | expr OR    expr
-            | NOT expr
-            | expr RIGHTSHIFT expr
-            | expr LEFTSHIFT  expr
-            | '(' expr ')'"""
-    pass
-
-def p_literal(p):
-    """literal : STRING
-               | NUMBER
-               | FLOATNUMBER
-               | LIT_BOOL"""
-    pass
-
-def p_enumeration(p):
-    "enumeration : ident ':' ident"
-    pass
-
-def p_var(p):
-    "var : ident"
-    pass
-
-lex.lex()
-yacc.yacc(write_tables=0)
-
-slicc_generated_cc = set([
-    'ControllerFactory.cc',
-    'MachineType.cc'])
-
-slicc_generated_hh = set([
-    'ControllerFactory.hh',
-    'MachineType.hh',
-    'Types.hh',
-    'protocol_name.hh' ])
-
-class Machine(object):
-    def __init__(self, name, decls):
-        self.name = name
-        self.decls = decls
-
-    def add(self, hh, cc):
-        hh.add('%s_Controller.hh' % self.name)
-        hh.add('%s_Profiler.hh' % self.name)
-
-        cc.add('%s_Controller.cc' % self.name)
-        cc.add('%s_Profiler.cc' % self.name)
-        cc.add('%s_Transitions.cc' % self.name)
-        cc.add('%s_Wakeup.cc' % self.name)
-
-        for decl in self.decls:
-            decl.add(hh, cc, self.name)
-
-class Declaration(object):
-    hh = False
-    cc = False
-    def __init__(self, name):
-        self.name = name
-
-    def add(self, hh, cc, name=None):
-        #print '>>>', type(self).__name__, self.name
-        if name:
-            name += '_'
-        else:
-            name = ""
-        if self.hh:
-            hh.add('%s%s.hh' % (name, self.name))
-        if self.cc:
-            cc.add('%s%s.cc' % (name, self.name))
-
-class Action(Declaration): pass
-class InPort(Declaration): pass
-class OutPort(Declaration): pass
-class Transition(Declaration): pass
-class Extern(Declaration): pass
-class Global(Declaration):
-    hh = True
-    cc = True
-class Struct(Declaration):
-    hh = True
-    cc = True
-class Enum(Declaration):
-    hh = True
-    cc = True
-class Object(Declaration): pass
-class Function(Declaration):
-    cc = True
-
-def read_slicc(sources):
-    if not isinstance(sources, (list,tuple)):
-        sources = [ sources ]
-
-    sm_files = []
-    for source in sources:
-        for sm_file in file(source, "r"):
-            sm_file = sm_file.strip()
-            if not sm_file:
-                continue
-            if sm_file.startswith("#"):
-                continue
-            sm_files.append(sm_file)
-
-    return sm_files
-
-def scan(filenames):
-    hh = slicc_generated_hh.copy()
-    cc = slicc_generated_cc.copy()
-
-    for filename in filenames:
-        lex.lexer.lineno = 1
-        try:
-            print "parsing ",filename
-            results = yacc.parse(file(filename, 'r').read())
-        except (TokenError, ParseError), e:
-            sys.exit("%s: %s:%d" % (e, filename, e.token.lineno))
-            
-        for result in results:
-            result.add(hh, cc)
-
-    return list(hh), list(cc)
-
-if __name__ == '__main__':
-    import sys
-
-    hh, cc = scan(read_slicc(sys.argv[1:]))
-    hh.sort()
-    cc.sort()
-    print 'Headers:'
-    for i in hh:
-        print '    %s' % i
-
-    print 'Sources:'
-    for i in cc:
-        print '    %s' % i
diff --git a/src/mem/slicc/parser/parser.yy b/src/mem/slicc/parser/parser.yy
deleted file mode 100644
index c8cef3b..0000000
--- a/src/mem/slicc/parser/parser.yy
+++ /dev/null
@@ -1,360 +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 <string>
-#include <stdio.h>
-#include <assert.h>
-#include "mem/slicc/ast/ASTs.hh"
-#include <vector>
-
-#define YYMAXDEPTH 100000
-#define YYERROR_VERBOSE
-
-extern char* yytext;
-
-extern "C" void yyerror(char*);
-extern "C" int yylex();
-
-%}
-
-%union {
-  string* str_ptr;
-  Vector<string>* string_vector_ptr;
-  std::vector<string*>* stdstring_vector_ptr;
-
-  // Decls
-  DeclAST* decl_ptr;
-  DeclListAST* decl_list_ptr;
-  Vector<DeclAST*>* decl_vector_ptr;
-
-  // TypeField
-  TypeFieldAST* type_field_ptr;
-  Vector<TypeFieldAST*>* type_field_vector_ptr;
-
-  // Type
-  TypeAST* type_ptr;
-  Vector<TypeAST*>* type_vector_ptr;
-
-  // Formal Params
-  FormalParamAST* formal_param_ptr;
-  Vector<FormalParamAST*>* formal_param_vector_ptr;
-
-  // Statements
-  StatementAST* statement_ptr;
-  StatementListAST* statement_list_ptr;
-  Vector<StatementAST*>* statement_vector_ptr;
-
-  // Pairs
-  PairAST* pair_ptr;
-  PairListAST* pair_list_ptr;
-
-  // Expressions
-  VarExprAST* var_expr_ptr;
-  ExprAST* expr_ptr;
-  Vector<ExprAST*>* expr_vector_ptr;
-}
-
-%type <type_ptr> type void type_or_void
-%type <type_vector_ptr> types type_list
-
-  // Formal Params
-%type <formal_param_ptr> formal_param
-%type <formal_param_vector_ptr> formal_params formal_param_list
-
-%type <str_ptr> ident field
-%type <string_vector_ptr> ident_list idents
-
-%type <statement_ptr> statement if_statement
-%type <statement_list_ptr> statement_list
-%type <statement_vector_ptr> statements
-
-%type <decl_ptr> decl
-%type <decl_list_ptr> decl_list
-%type <decl_vector_ptr> decls
-
-%type <type_field_vector_ptr> type_members type_enums type_methods
-%type <type_field_ptr> type_member type_enum type_method
-
-%type <var_expr_ptr> var
-%type <expr_ptr> expr literal enumeration
-%type <expr_vector_ptr> expr_list
-
-%type <pair_ptr> pair
-%type <pair_list_ptr> pair_list pairs
-
-%token <str_ptr> IDENT STRING NUMBER FLOATNUMBER LIT_BOOL VOID
-%token <str_ptr> IMBED IMBED_TYPE
-%token CHIP THIS
-%token ASSIGN DOUBLE_COLON DOT SEMICOLON COLON
-%token GLOBAL_DECL MACHINE_DECL IN_PORT_DECL OUT_PORT_DECL
-%token PEEK ENQUEUE COPY_HEAD CHECK_ALLOCATE CHECK_STOP_SLOTS
-//%token DEQUEUE REMOVE_EARLY SKIP_EARLY PEEK_EARLY
-%token DEBUG_EXPR_TOKEN DEBUG_MSG_TOKEN
-%token ACTION_DECL TRANSITION_DECL TYPE_DECL STRUCT_DECL EXTERN_TYPE_DECL ENUM_DECL
-%token TYPE_FIELD OTHER IF ELSE RETURN NEW
-
-%token <str_ptr> EQ NE '<' '>' LE GE NOT AND OR PLUS DASH STAR SLASH RIGHTSHIFT LEFTSHIFT
-
-%left OR
-%left AND
-%nonassoc EQ NE
-%nonassoc '<' '>' GE LE
-%left PLUS DASH
-%left STAR SLASH
-%nonassoc NOT
-%nonassoc DOUBLE_COLON DOT '['
-
-%%
-
-file: decl_list { g_decl_list_ptr = $1; }
-
-decl_list:  decls { $$ = new DeclListAST($1); }
-
-decls: decl decls { $2->insertAtTop($1); $$ = $2; }
-     | { $$ = new Vector<DeclAST*>; }
-     ;
-
-decl:  MACHINE_DECL     '(' ident pair_list ')' ':' formal_param_list '{' decl_list '}' { $$ = new MachineAST($3, $4, $7, $9); }
-    |  ACTION_DECL      '(' ident pair_list ')' statement_list { $$ = new ActionDeclAST($3, $4, $6); }
-    |  IN_PORT_DECL     '(' ident ',' type ',' var pair_list ')' statement_list { $$ = new InPortDeclAST($3, $5, $7, $8, $10); }
-    |  OUT_PORT_DECL    '(' ident ',' type ',' var pair_list ')' SEMICOLON { $$ = new OutPortDeclAST($3, $5, $7, $8); }
-    |  TRANSITION_DECL  '(' ident_list ',' ident_list ',' ident pair_list ')' ident_list { $$ = new TransitionDeclAST($3, $5, $7, $8, $10); }
-    |  TRANSITION_DECL  '(' ident_list ',' ident_list           pair_list ')' ident_list { $$ = new TransitionDeclAST($3, $5, NULL, $6, $8); }
-    |  EXTERN_TYPE_DECL '(' type pair_list ')' SEMICOLON            { $4->addPair(new PairAST("external", "yes")); $$ = new TypeDeclAST($3, $4, NULL); }
-    |  EXTERN_TYPE_DECL '(' type pair_list ')' '{' type_methods '}' { $4->addPair(new PairAST("external", "yes")); $$ = new TypeDeclAST($3, $4, $7); }
-    |  GLOBAL_DECL      '(' type pair_list ')' '{' type_members '}' { $4->addPair(new PairAST("global", "yes"));$$ = new TypeDeclAST($3, $4, $7); }
-    |  STRUCT_DECL      '(' type pair_list ')' '{' type_members '}' { $$ = new TypeDeclAST($3, $4, $7); }
-    |  ENUM_DECL        '(' type pair_list ')' '{' type_enums   '}' { $4->addPair(new PairAST("enumeration", "yes")); $$ = new EnumDeclAST($3, $4, $7); }
-    |  type ident pair_list SEMICOLON { $$ = new ObjDeclAST($1, $2, $3); }
-    |  type ident '(' formal_param_list ')' pair_list SEMICOLON { $$ = new FuncDeclAST($1, $2, $4, $6, NULL); } // non-void function
-    |  void ident '(' formal_param_list ')' pair_list SEMICOLON { $$ = new FuncDeclAST($1, $2, $4, $6, NULL); } // void function
-    |  type ident '(' formal_param_list ')' pair_list statement_list { $$ = new FuncDeclAST($1, $2, $4, $6, $7); } // non-void function
-    |  void ident '(' formal_param_list ')' pair_list statement_list { $$ = new FuncDeclAST($1, $2, $4, $6, $7); } // void function
-    ;
-
-// Type fields
-
-type_members: type_member type_members { $2->insertAtTop($1); $$ = $2; }
-            | { $$ = new Vector<TypeFieldAST*>; }
-            ;
-
-type_member: type ident pair_list SEMICOLON { $$ = new TypeFieldMemberAST($1, $2, $3, NULL); }
-           | type ident ASSIGN expr SEMICOLON { $$ = new TypeFieldMemberAST($1, $2, new PairListAST(), $4); }
-           ;
-
-// Methods
-type_methods: type_method type_methods { $2->insertAtTop($1); $$ = $2; }
-            | { $$ = new Vector<TypeFieldAST*>; }
-            ;
-
-type_method: type_or_void ident '(' type_list ')' pair_list SEMICOLON { $$ = new TypeFieldMethodAST($1, $2, $4, $6); }
-           ;
-
-// Enum fields
-type_enums: type_enum type_enums { $2->insertAtTop($1); $$ = $2; }
-          | { $$ = new Vector<TypeFieldAST*>; }
-          ;
-
-type_enum: ident pair_list SEMICOLON { $$ = new TypeFieldEnumAST($1, $2); }
-         ;
-
-// Type
-type_list : types { $$ = $1; }
-          | { $$ = new Vector<TypeAST*>; }
-          ;
-
-types    : type ',' types { $3->insertAtTop($1); $$ = $3; }
-         | type { $$ = new Vector<TypeAST*>; $$->insertAtTop($1); }
-         ;
-
-type: ident { $$ = new TypeAST($1); }
-    ;
-
-void: VOID { $$ = new TypeAST($1); }
-    ;
-
-type_or_void: type { $$ = $1; }
-    | void { $$ = $1; }
-    ;
-
-// Formal Param
-formal_param_list : formal_params { $$ = $1; }
-                | { $$ = new Vector<FormalParamAST*>; }
-                ;
-
-formal_params : formal_param ',' formal_params { $3->insertAtTop($1); $$ = $3; }
-              | formal_param { $$ = new Vector<FormalParamAST*>; $$->insertAtTop($1); }
-              ;
-
-formal_param : type ident { $$ = new FormalParamAST($1, $2); }
-             ;
-
-// Idents and lists
-ident: IDENT { $$ = $1; };
-
-ident_list: '{' idents '}' { $$ = $2; }
-          | ident { $$ = new Vector<string>; $$->insertAtTop(*($1)); delete $1; }
-          ;
-
-idents:  ident SEMICOLON idents { $3->insertAtTop(*($1)); $$ = $3; delete $1; }
-      |  ident ',' idents { $3->insertAtTop(*($1)); $$ = $3; delete $1; }
-      |  ident idents { $2->insertAtTop(*($1)); $$ = $2; delete $1; }
-      |  { $$ = new Vector<string>; }
-      ;
-
-// Pair and pair lists
-pair_list: ',' pairs { $$ = $2; }
-         | { $$ = new PairListAST(); }
-
-pairs    : pair ',' pairs { $3->addPair($1); $$ = $3; }
-         | pair { $$ = new PairListAST(); $$->addPair($1); }
-         ;
-
-pair     : ident '=' STRING { $$ = new PairAST($1, $3); }
-         | ident '=' ident { $$ = new PairAST($1, $3); }
-         | STRING { $$ = new PairAST(new string("short"), $1); }
-         ;
-
-// Below are the rules for action descriptions
-
-statement_list:  '{' statements '}' { $$ = new StatementListAST($2); }
-              ;
-
-statements: statement statements  { $2->insertAtTop($1); $$ = $2; }
-          |  { $$ = new Vector<StatementAST*>; }
-          ;
-
-expr_list:  expr ',' expr_list  { $3->insertAtTop($1); $$ = $3; }
-         |  expr { $$ = new Vector<ExprAST*>; $$->insertAtTop($1); }
-         |  { $$ = new Vector<ExprAST*>; }
-         ;
-
-statement:  expr SEMICOLON { $$ = new ExprStatementAST($1); }
-         |  expr ASSIGN expr SEMICOLON { $$ = new AssignStatementAST($1, $3); }
-         |  ENQUEUE      '(' var ',' type pair_list ')' statement_list { $$ = new EnqueueStatementAST($3, $5, $6, $8); }
-         |  PEEK         '(' var ',' type ')' statement_list { $$ = new PeekStatementAST($3, $5, $7, "peek"); }
-//         |  PEEK_EARLY   '(' var ',' type ')' statement_list { $$ = new PeekStatementAST($3, $5, $7, "peekEarly"); }
-         |  COPY_HEAD    '(' var ',' var pair_list ')' SEMICOLON { $$ = new CopyHeadStatementAST($3, $5, $6); }
-         |  CHECK_ALLOCATE '(' var ')' SEMICOLON { $$ = new CheckAllocateStatementAST($3); }
-         |  CHECK_STOP_SLOTS '(' var ',' STRING ',' STRING ')' SEMICOLON { $$ = new CheckStopSlotsStatementAST($3, $5, $7); }
-         |  if_statement { $$ = $1; }
-         |  RETURN expr SEMICOLON { $$ = new ReturnStatementAST($2); }
-         ;
-
-if_statement: IF '(' expr ')' statement_list ELSE statement_list { $$ = new IfStatementAST($3, $5, $7); }
-            | IF '(' expr ')' statement_list { $$ = new IfStatementAST($3, $5, NULL); }
-            | IF '(' expr ')' statement_list ELSE if_statement { $$ = new IfStatementAST($3, $5, new StatementListAST($7)); }
-            ;
-
-expr:  var { $$ = $1; }
-    |  literal { $$ = $1; }
-    |  enumeration { $$ = $1; }
-    |  ident '(' expr_list ')' { $$ = new FuncCallExprAST($1, $3); }
-    |  NEW type { $$ = new NewExprAST($2); }
-
-// globally access a local chip component and call a method
-    |  THIS DOT var '[' expr ']' DOT var DOT ident '(' expr_list ')' { $$ = new ChipComponentAccessAST($3, $5, $8, $10, $12 ); }
-// globally access a local chip component and access a data member
-    |  THIS DOT var '[' expr ']' DOT var DOT field { $$ = new ChipComponentAccessAST($3, $5, $8, $10 ); }
-// globally access a specified chip component and call a method
-    |  CHIP '[' expr ']' DOT var '[' expr ']' DOT var DOT ident '(' expr_list ')' { $$ = new ChipComponentAccessAST($3, $6, $8, $11, $13, $15 ); }
-// globally access a specified chip component and access a data member
-    |  CHIP '[' expr ']' DOT var '[' expr ']' DOT var DOT field { $$ = new ChipComponentAccessAST($3, $6, $8, $11, $13 ); }
-
-
-    |  expr DOT field { $$ = new MemberExprAST($1, $3); }
-    |  expr DOT ident '(' expr_list ')' { $$ = new MethodCallExprAST($1, $3, $5); }
-    |  type DOUBLE_COLON ident '(' expr_list ')' { $$ = new MethodCallExprAST($1, $3, $5); }
-    |  expr '[' expr_list ']' { $$ = new MethodCallExprAST($1, new string("lookup"), $3); }
-    |  expr STAR  expr { $$ = new InfixOperatorExprAST($1, $2, $3); }
-    |  expr SLASH expr { $$ = new InfixOperatorExprAST($1, $2, $3); }
-    |  expr PLUS  expr { $$ = new InfixOperatorExprAST($1, $2, $3); }
-    |  expr DASH  expr { $$ = new InfixOperatorExprAST($1, $2, $3); }
-    |  expr '<'   expr { $$ = new InfixOperatorExprAST($1, $2, $3); }
-    |  expr '>'   expr { $$ = new InfixOperatorExprAST($1, $2, $3); }
-    |  expr LE    expr { $$ = new InfixOperatorExprAST($1, $2, $3); }
-    |  expr GE    expr { $$ = new InfixOperatorExprAST($1, $2, $3); }
-    |  expr EQ    expr { $$ = new InfixOperatorExprAST($1, $2, $3); }
-    |  expr NE    expr { $$ = new InfixOperatorExprAST($1, $2, $3); }
-    |  expr AND   expr { $$ = new InfixOperatorExprAST($1, $2, $3); }
-    |  expr OR    expr { $$ = new InfixOperatorExprAST($1, $2, $3); }
-    |  expr RIGHTSHIFT expr { $$ = new InfixOperatorExprAST($1, $2, $3); }
-    |  expr LEFTSHIFT  expr { $$ = new InfixOperatorExprAST($1, $2, $3); }
-//    |  NOT expr        { $$ = NULL; }        // FIXME - unary not
-//    |  DASH expr %prec NOT { $$ = NULL; }    // FIXME - unary minus
-   |  '(' expr ')' { $$ = $2; }
-    ;
-
-literal: STRING   { $$ = new LiteralExprAST($1, "string"); }
-       | NUMBER   { $$ = new LiteralExprAST($1, "int"); }
-       | FLOATNUMBER   { $$ = new LiteralExprAST($1, "int"); }
-       | LIT_BOOL { $$ = new LiteralExprAST($1, "bool");  }
-       ;
-
-enumeration: ident ':' ident { $$ = new EnumExprAST(new TypeAST($1), $3); }
-           ;
-
-var: ident { $$ = new VarExprAST($1); }
-   ;
-
-field: ident { $$ = $1; }
-     ;
-
-%%
-
-extern FILE *yyin;
-
-DeclListAST* parse(string filename)
-{
-  FILE *file;
-  file = fopen(filename.c_str(), "r");
-  if (!file) {
-    cerr << "Error: Could not open file: " << filename << endl;
-    exit(1);
-  }
-  g_line_number = 1;
-  g_file_name() = filename;
-  yyin = file;
-  g_decl_list_ptr = NULL;
-  yyparse();
-  return g_decl_list_ptr;
-}
-
-extern "C" void yyerror(char* s)
-{
-  fprintf(stderr, "%s:%d: %s at %s\n", g_file_name().c_str(), g_line_number, s, yytext);
-  exit(1);
-}
-
diff --git a/src/mem/slicc/slicc_global.hh b/src/mem/slicc/slicc_global.hh
deleted file mode 100644
index 40a00c9..0000000
--- a/src/mem/slicc/slicc_global.hh
+++ /dev/null
@@ -1,125 +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.
- */
-
-#ifndef SLICC_GLOBAL_H
-#define SLICC_GLOBAL_H
-
-#include <cassert>
-
-#include "mem/gems_common/std-includes.hh"
-#include "mem/gems_common/Map.hh"
-
-typedef unsigned char uint8;
-typedef unsigned int uint32;
-typedef unsigned long long uint64;
-
-typedef signed char int8;
-typedef int int32;
-typedef long long int64;
-
-typedef long long integer_t;
-typedef unsigned long long uinteger_t;
-
-const bool ASSERT_FLAG = true;
-
-// when CHECK_RESOURCE_DEADLOCK is enabled, slicc will generate additional code
-// that works in conjuction with the resources rank value specified in the protocol
-// to detect invalid resource stalls as soon as they occur.
-const bool CHECK_INVALID_RESOURCE_STALLS = false;
-
-#undef assert
-#define assert(EXPR) ASSERT(EXPR)
-
-#define ASSERT(EXPR)\
-{\
-  if (ASSERT_FLAG) {\
-    if (!(EXPR)) {\
-      cerr << "failed assertion '"\
-           << #EXPR << "' at fn "\
-           << __PRETTY_FUNCTION__ << " in "\
-           << __FILE__ << ":"\
-           << __LINE__ << endl;\
-      if(isatty(STDERR_FILENO)) {\
-        cerr << "At this point you might want to attach a debug to ";\
-        cerr << "the running and get to the" << endl;\
-        cerr << "crash site; otherwise press enter to continue" << endl;\
-        cerr << "PID: " << getpid();\
-        cerr << endl << flush; \
-        char c; \
-        cin.get(c); \
-      }\
-      abort();\
-    }\
-  }\
-}
-
-class State;
-class Event;
-class Symbol;
-class Var;
-
-namespace __gnu_cxx {
-  template <> struct hash<State*>
-  {
-    size_t operator()(State* s) const { return (size_t) s; }
-  };
-  template <> struct hash<Event*>
-  {
-    size_t operator()(Event* s) const { return (size_t) s; }
-  };
-  template <> struct hash<Symbol*>
-  {
-    size_t operator()(Symbol* s) const { return (size_t) s; }
-  };
-  template <> struct hash<Var*>
-  {
-    size_t operator()(Var* s) const { return (size_t) s; }
-  };
-} // namespace __gnu_cxx
-
-namespace std {
-  template <> struct equal_to<Event*>
-  {
-    bool operator()(Event* s1, Event* s2) const { return s1 == s2; }
-  };
-  template <> struct equal_to<State*>
-  {
-    bool operator()(State* s1, State* s2) const { return s1 == s2; }
-  };
-  template <> struct equal_to<Symbol*>
-  {
-    bool operator()(Symbol* s1, Symbol* s2) const { return s1 == s2; }
-  };
-  template <> struct equal_to<Var*>
-  {
-    bool operator()(Var* s1, Var* s2) const { return s1 == s2; }
-  };
-} // namespace std
-
-#endif //SLICC_GLOBAL_H
diff --git a/src/mem/slicc/symbols/Action.hh b/src/mem/slicc/symbols/Action.hh
deleted file mode 100644
index dbb0c83..0000000
--- a/src/mem/slicc/symbols/Action.hh
+++ /dev/null
@@ -1,52 +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$
- */
-
-#ifndef ACTION_H
-#define ACTION_H
-
-#include "mem/slicc/symbols/Symbol.hh"
-
-class Action : public Symbol {
-public:
-  Action(string id,
-         const Map<Var*, string>& resources,
-         const Location& location,
-         const Map<string, string>& pairs) : Symbol(id, location, pairs) { m_resources = resources; }
-  const Map<Var*, string>& getResources() const { return m_resources; }
-  void print(ostream& out) const { out << "[Action: " << getIdent() << "]"; }
-
-private:
-  Map<Var*, string> m_resources;
-};
-
-#endif //ACTION_H
diff --git a/src/mem/slicc/symbols/Action.py b/src/mem/slicc/symbols/Action.py
new file mode 100644
index 0000000..880fab1
--- /dev/null
+++ b/src/mem/slicc/symbols/Action.py
@@ -0,0 +1,38 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.symbols.Symbol import Symbol
+
+class Action(Symbol):
+  def __init__(self, table, ident, resources, location, pairs):
+    super(Action, self).__init__(table, ident, location, pairs)
+    self.resources = resources
+
+  def __repr__(self):
+    return "[Action: %s]" % self.ident
+
+__all__ = [ "Action" ]
diff --git a/src/mem/slicc/symbols/Event.hh b/src/mem/slicc/symbols/Event.hh
deleted file mode 100644
index 40cefc9..0000000
--- a/src/mem/slicc/symbols/Event.hh
+++ /dev/null
@@ -1,45 +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$
- */
-
-#ifndef EVENT_H
-#define EVENT_H
-
-#include "mem/slicc/symbols/Symbol.hh"
-
-class Event : public Symbol {
-public:
-  Event(string id, const Location& location, const Map<string, string>& pairs) : Symbol(id, location, pairs) {}
-  void print(ostream& out) const { out << "[Event: " << getIdent() << "]"; }
-};
-
-#endif //EVENT_H
diff --git a/src/mem/slicc/symbols/Event.py b/src/mem/slicc/symbols/Event.py
new file mode 100644
index 0000000..9ff4d8b
--- /dev/null
+++ b/src/mem/slicc/symbols/Event.py
@@ -0,0 +1,34 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.symbols.Symbol import Symbol
+
+class Event(Symbol):
+    def __repr__(self):
+        return "[Event: %s]" % self.ident
+
+__all__ = [ "Event" ]
diff --git a/src/mem/slicc/symbols/Func.cc b/src/mem/slicc/symbols/Func.cc
deleted file mode 100644
index d29138b..0000000
--- a/src/mem/slicc/symbols/Func.cc
+++ /dev/null
@@ -1,143 +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.
- */
-
-/*
- * Func.cc
- *
- * Description: See Func.hh
- *
- * $Id$
- *
- */
-
-#include "mem/slicc/symbols/Func.hh"
-#include "mem/slicc/symbols/SymbolTable.hh"
-#include "mem/slicc/generator/fileio.hh"
-#include "mem/slicc/symbols/StateMachine.hh"
-
-Func::Func(string id, const Location& location,
-           Type* type_ptr, const Vector<Type*>& param_type_vec,
-           const Vector<string>& param_string_vec, string body,
-           const Map<string, string>& pairs, StateMachine* machine_ptr)
-  : Symbol(id, location, pairs)
-{
-  m_type_ptr = type_ptr;
-  m_param_type_vec = param_type_vec;
-  m_param_string_vec = param_string_vec;
-  m_body = body;
-  m_isInternalMachineFunc = false;
-
-  if (machine_ptr == NULL) {
-    m_c_ident = id;
-  } else if (existPair("external") || existPair("primitive")) {
-    m_c_ident = id;
-  } else {
-    m_machineStr = machine_ptr->toString();
-    m_c_ident = m_machineStr + "_" + id;  // Append with machine name
-    m_isInternalMachineFunc = true;
-  }
-}
-
-void Func::funcPrototype(string& code) const
-{
-  if (isExternal()) {
-    // Do nothing
-  } else {
-    string return_type = m_type_ptr->cIdent();
-    Type* void_type_ptr = g_sym_table.getType("void");
-    if (existPair("return_by_ref") && (m_type_ptr != void_type_ptr)) {
-      return_type += "&";
-    }
-    code += return_type + " " + cIdent() + "(";
-    int size = m_param_string_vec.size();
-    for(int i=0; i<size; i++) {
-      // Generate code
-      if (i != 0) {
-        code += ", ";
-      }
-      code += m_param_string_vec[i];
-    }
-    code += ");\n";
-  }
-}
-
-// This write a function of object Chip
-void Func::writeCFiles(string path)
-{
-  if (isExternal()) {
-    // Do nothing
-  } else {
-    ostringstream out;
-
-    // Header
-    out << "/** Auto generated C++ code started by "<<__FILE__<<":"<<__LINE__<< " */" << endl;
-    out << endl;
-    out << "#include \"mem/protocol/Types.hh\"" << endl;
-    if (m_isInternalMachineFunc) {
-      out << "#include \"mem/protocol/" << m_machineStr << "_Controller.hh\"" << endl;
-    }
-    out << endl;
-
-    // Generate function header
-    string code;
-    Type* void_type_ptr = g_sym_table.getType("void");
-    string return_type = m_type_ptr->cIdent();
-    code += return_type;
-    if (existPair("return_by_ref") && m_type_ptr != void_type_ptr) {
-      code += "&";
-    }
-    if (!m_isInternalMachineFunc) {
-      code += " Chip::" + cIdent() + "(";
-    } else {
-      code += " " + m_machineStr + "_Controller::" + cIdent() + "(";
-    }
-    int size = m_param_type_vec.size();
-    for(int i=0; i<size; i++) {
-      // Generate code
-      if (i != 0) {
-        code += ", ";
-      }
-      code += m_param_string_vec[i];
-    }
-    code += ")";
-
-    // Function body
-    code += "\n{\n";
-    code += m_body;
-    code += "}\n";
-    out << code << endl;
-
-    // Write it out
-    conditionally_write_file(path + cIdent() + ".cc", out);
-  }
-}
-
-void Func::print(ostream& out) const
-{
-}
diff --git a/src/mem/slicc/symbols/Func.hh b/src/mem/slicc/symbols/Func.hh
deleted file mode 100644
index 8f8548b..0000000
--- a/src/mem/slicc/symbols/Func.hh
+++ /dev/null
@@ -1,96 +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.
- */
-
-/*
- * Func.hh
- *
- * Description:
- *
- * $Id$
- *
- */
-
-#ifndef FUNC_H
-#define FUNC_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/symbols/Type.hh"
-class StateMachine;
-
-class Func : public Symbol {
-public:
-  // Constructors
-  Func(string id, const Location& location,
-       Type* type_ptr, const Vector<Type*>& param_type_vec, const Vector<string>& param_string_vec,
-       string body, const Map<string, string>& pairs, StateMachine* machine_ptr);
-
-  // Destructor
-  ~Func() {}
-
-  // Public Methods
-  string cIdent() const { return m_c_ident; }
-  const Vector<Type*>& getParamTypes() const { return m_param_type_vec; }
-  Type* getReturnType() const { return m_type_ptr; }
-  void writeCFiles(string path) ;
-  void funcPrototype(string& code) const;
-  bool isExternal() const { return existPair("external"); }
-  bool isInternalMachineFunc() const { return m_isInternalMachineFunc; }
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  Func(const Func& obj);
-  Func& operator=(const Func& obj);
-
-  // Data Members (m_ prefix)
-  Type* m_type_ptr;
-  Vector<Type*> m_param_type_vec;
-  Vector<string> m_param_string_vec;
-  string m_body;
-  string m_c_ident;
-  string m_machineStr;
-  bool m_isInternalMachineFunc;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const Func& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const Func& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //FUNC_H
diff --git a/src/mem/slicc/symbols/Func.py b/src/mem/slicc/symbols/Func.py
new file mode 100644
index 0000000..5c812a9
--- /dev/null
+++ b/src/mem/slicc/symbols/Func.py
@@ -0,0 +1,107 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util import code_formatter
+
+from slicc.symbols.Symbol import Symbol
+from slicc.symbols.Type import Type
+
+class Func(Symbol):
+    def __init__(self, table, ident, location, return_type, param_types,
+                 param_strings, body, pairs, machine):
+        super(Func, self).__init__(table, ident, location, pairs)
+        self.return_type = return_type
+        self.param_types = param_types
+        self.param_strings = param_strings
+        self.body = body
+        self.isInternalMachineFunc = False
+
+        if machine is None:
+            self.c_ident = ident
+        elif "external" in self or "primitive" in self:
+            self.c_ident = ident
+        else:
+            self.machineStr = str(machine)
+            # Append with machine name
+            self.c_ident = "%s_%s" % (self.machineStr, ident)
+            self.isInternalMachineFunc = True
+
+    def __repr__(self):
+        return ""
+
+    @property
+    def prototype(self):
+        if "external" in self:
+            return ""
+
+        return_type = self.return_type.c_ident
+        void_type = self.symtab.find("void", Type)
+        if "return_by_ref" in self and self.return_type != void_type:
+            return_type += "&"
+
+        return "%s %s(%s);" % (return_type, self.c_ident,
+                               ", ".join(self.param_strings))
+
+    def writeCodeFiles(self, path):
+        '''This write a function of object Chip'''
+        if "external" in self:
+            return
+
+        code = code_formatter()
+
+        # Header
+        code('''
+/** Auto generated C++ code started by $__file__:$__line__ */
+
+#include "mem/protocol/Types.hh"
+''')
+
+        if self.isInternalMachineFunc:
+            code('#include "mem/protocol/${{self.machineStr}}_Controller.hh"')
+
+        # Generate function header
+        void_type = self.symtab.find("void", Type)
+        return_type = self.return_type.c_ident
+        if "return_by_ref" in self and self.return_type != void_type:
+            return_type += "&"
+
+        if self.isInternalMachineFunc:
+            klass = "%s_Controller" % self.machineStr
+        else:
+            klass = "Chip"
+
+        params = ', '.join(self.param_strings)
+
+        code('''
+$return_type ${klass}::${{self.c_ident}}($params)
+{
+${{self.body}}
+}
+''')
+        code.write(path, "%s.cc" % self.c_ident)
+
+__all__ = [ "Func" ]
diff --git a/src/mem/slicc/symbols/State.hh b/src/mem/slicc/symbols/State.hh
deleted file mode 100644
index 39900d5..0000000
--- a/src/mem/slicc/symbols/State.hh
+++ /dev/null
@@ -1,45 +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$
- */
-
-#ifndef STATE_H
-#define STATE_H
-
-#include "mem/slicc/symbols/Symbol.hh"
-
-class State : public Symbol {
-public:
-  State(string id, const Location& location, const Map<string, string>& pairs) : Symbol(id, location, pairs) {}
-  void print(ostream& out) const { out << "[State: " << getIdent() << "]"; }
-};
-
-#endif //STATE_H
diff --git a/src/mem/slicc/symbols/State.py b/src/mem/slicc/symbols/State.py
new file mode 100644
index 0000000..1236932
--- /dev/null
+++ b/src/mem/slicc/symbols/State.py
@@ -0,0 +1,34 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.symbols.Symbol import Symbol
+
+class State(Symbol):
+    def __repr__(self):
+        return "[State: %s]" % self.ident
+
+__all__ = [ "State" ]
diff --git a/src/mem/slicc/symbols/StateMachine.cc b/src/mem/slicc/symbols/StateMachine.cc
deleted file mode 100644
index 86f92b6..0000000
--- a/src/mem/slicc/symbols/StateMachine.cc
+++ /dev/null
@@ -1,1534 +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 started_writes();" << endl;
-  out << "  void clear_atomic();" << 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");
-    string::size_type pos = output.find("TransitionResult result = doTransition((L1Cache_mandatory_request_type_to_event(((*in_msg_ptr)).m_Type)), L1Cache_getState(addr), addr);");
-    assert(pos != string::npos);
-    string atomics_string = "\n \
-             if ((((*in_msg_ptr)).m_Type) == CacheRequestType_ATOMIC) { \n \
-               if (servicing_atomic == 0) { \n \
-                  if (locked_read_request1 == Address(-1)) { \n \
-                    assert(read_counter == 0); \n \ 
-                    locked_read_request1 = addr;  \n \
-                    assert(read_counter == 0); \n \
-                    read_counter++; \n \
-                  } \n \
-                  else if (addr == locked_read_request1) { \n \
-                    ; // do nothing \n\ 
-                  } \n \
-                  else { \n \
-                    assert(0); // should never be here if servicing one request at a time \n\ 
-                  } \n \
-               } \n \
-               else if (!started_receiving_writes) { \n \
-               if (servicing_atomic == 1) { \n \
-                  if (locked_read_request2 == Address(-1)) { \n \
-                    assert(locked_read_request1 != Address(-1)); \n \
-                    assert(read_counter == 1); \n \ 
-                    locked_read_request2 = addr;  \n \
-                    assert(read_counter == 1); \n \
-                    read_counter++; \n \
-                  } \n \
-                  else if (addr == locked_read_request2) { \n \
-                    ; // do nothing \n\ 
-                  } \n \
-                  else { \n \
-                    assert(0); // should never be here if servicing one request at a time \n\ 
-                  } \n \
-               } \n \
-               else if (servicing_atomic == 2) { \n \
-                  if (locked_read_request3 == Address(-1)) { \n \
-                    assert(locked_read_request1 != Address(-1)); \n \
-                    assert(locked_read_request2 != Address(-1)); \n \
-                    assert(read_counter == 1); \n \ 
-                    locked_read_request3 = addr;  \n \
-                    assert(read_counter == 2); \n \
-                    read_counter++; \n \
-                  } \n \
-                  else if (addr == locked_read_request3) { \n \
-                    ; // do nothing \n\ 
-                  } \n \
-                  else { \n \
-                    assert(0); // should never be here if servicing one request at a time \n\ 
-                  } \n \
-               } \n \
-               else if (servicing_atomic == 3) { \n \
-                  if (locked_read_request4 == Address(-1)) { \n \
-                    assert(locked_read_request1 != Address(-1)); \n \
-                    assert(locked_read_request2 != Address(-1)); \n \
-                    assert(locked_read_request3 != Address(-1)); \n \
-                    assert(read_counter == 1); \n \ 
-                    locked_read_request4 = addr;  \n \
-                    assert(read_counter == 3); \n \
-                    read_counter++; \n \ 
-                  } \n \
-                  else if (addr == locked_read_request4) { \n \
-                    ; // do nothing \n\ 
-                  } \n \
-                  else { \n \
-                    assert(0); // should never be here if servicing one request at a time \n\ 
-                  } \n \
-               } \n \
-               else { \n \
-                 assert(0); \n \
-               } \n \
-             } \n \
-             } \n \ 
-             else { \n \
-               if (servicing_atomic > 0) { \n \
-                 // reset \n \
-                  servicing_atomic = 0; \n \
-                  read_counter = 0; \n \
-                  started_receiving_writes = false; \n \
-                  locked_read_request1 = Address(-1); \n \
-                  locked_read_request2 = Address(-1); \n \
-                  locked_read_request3 = Address(-1); \n \
-                  locked_read_request4 = Address(-1); \n \
-                } \n \
-              } \n \
-               ";
-    output.insert(pos, atomics_string);
-    /*string foo = "// Cannot do anything with this transition, go check next doable transition (mostly likely of next port)\n";
-    string::size_type next_pos = output.find(foo, pos);
-    next_pos = next_pos + foo.length();
-
-    assert(next_pos != string::npos);
-    string complete = "              }\n";
-    output.insert(next_pos, complete);*/
-    //out << 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 == 1)  && (locked_read_request1 == ((*in_msg_ptr)).m_Address)) || " << endl;
-          out << "       ((servicing_atomic == 2)  && (locked_read_request1 == ((*in_msg_ptr)).m_Address || locked_read_request2 == ((*in_msg_ptr)).m_Address)) || " << endl;
-          out << "       ((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)) || " << endl;
-          out << "       ((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)))) {" << endl;
-//          out << "      (locked_read_request2 == ((*in_msg_ptr)).m_Address) || (locked_read_request3 == ((*in_msg_ptr)).m_Address) || " << endl;
-//          out << "      (locked_read_request4 == ((*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;
-        }
-      }
-      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 << "}" << endl;
-    out << "void " << component << "_Controller::started_writes()" << endl;
-    out << "{" << endl;
-    out << "  started_receiving_writes = true; " << endl;
-    out << "}" << endl;
-    out << "void " << component << "_Controller::clear_atomic()" << endl;
-    out << "{" << endl;
-    out << "  assert(servicing_atomic > 0); " << endl;
-    out << "  read_counter--; " << endl;
-    out << "  servicing_atomic--; " << endl;
-    out << "  if (read_counter == 0) { " << endl;
-    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 << "  } " << endl;
-    out << "}" << endl;
-  }
-  else {
-    out << "void " << component << "_Controller::started_writes()" << endl;
-    out << "{" << endl;
-    out << "  assert(0); " << endl;
-    out << "}" << endl;
-    out << "void " << component << "_Controller::set_atomic(Address addr)" << endl;
-    out << "{" << endl;
-    out << "  assert(0); " << endl;
-    out << "}" << endl;
-
-    out << "void " << component << "_Controller::clear_atomic()" << 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;
-}
-
-
diff --git a/src/mem/slicc/symbols/StateMachine.hh b/src/mem/slicc/symbols/StateMachine.hh
deleted file mode 100644
index f5f3ab0..0000000
--- a/src/mem/slicc/symbols/StateMachine.hh
+++ /dev/null
@@ -1,156 +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$
- *
- * */
-
-#ifndef STATEMACHINE_H
-#define STATEMACHINE_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/gems_common/Vector.hh"
-#include "mem/gems_common/Map.hh"
-#include "mem/slicc/symbols/Symbol.hh"
-#include <list>
-
-using namespace std;
-
-class Transition;
-class Event;
-class State;
-class Action;
-class Var;
-class Func;
-class FormalParamAST;
-
-class StateMachine : public Symbol {
-public:
-  // Constructors
-  StateMachine(string ident, const Location& location, const Map<string, string>& pairs,  Vector<FormalParamAST*>* config_parameters);
-
-  // Destructor
-  ~StateMachine();
-
-  // Public Methods
-
-  // Add items to the state machine
-  //  void setMachine(string ident, const Map<string, string>& pairs);
-  void addState(State* state_ptr);
-  void addEvent(Event* event_ptr);
-  void addAction(Action* action_ptr);
-  void addTransition(Transition* trans_ptr);
-  void addInPort(Var* var) { m_in_ports.insertAtBottom(var); }
-  void addFunc(Func* func);
-  void addObj(Var* obj) { m_objs.insertAtBottom(obj); }
-
-  // Accessors to vectors
-  const State& getState(int index) const { return *m_states[index]; }
-  const Event& getEvent(int index) const { return *m_events[index]; }
-  const Action& getAction(int index) const { return *m_actions[index]; }
-  const Transition& getTransition(int index) const { return *m_transitions[index]; }
-  const Transition* getTransPtr(int stateIndex, int eventIndex) const;
-  const Var& getObject(int index) const { return *m_objs[index]; }
-
-  // Accessors for size of vectors
-  int numStates() const { return m_states.size(); }
-  int numEvents() const { return m_events.size(); }
-  int numActions() const { return m_actions.size(); }
-  int numTransitions() const { return m_transitions.size(); }
-  int numObjects() const { return m_objs.size(); }
-
-  void buildTable();  // Needs to be called before accessing the table
-
-  // Code generator methods
-  void writeCFiles(string path) ;
-  void writeHTMLFiles(string path) ;
-
-  void print(ostream& out) const { out << "[StateMachine: " << toString() << "]" << endl; }
-private:
-
-  Vector<FormalParamAST*>* m_config_parameters;
-
-  // Private Methods
-  void checkForDuplicate(const Symbol& sym) const;
-
-  int getStateIndex(State* state_ptr) const { return m_state_map.lookup(state_ptr); }
-  int getEventIndex(Event* event_ptr) const { return m_event_map.lookup(event_ptr); }
-
-  // Private copy constructor and assignment operator
-  //  StateMachine(const StateMachine& obj);
-  //  StateMachine& operator=(const StateMachine& obj);
-
-  void printControllerH(ostream& out, string component) ;
-  void printControllerC(ostream& out, string component) ;
-  void printCWakeup(ostream& out, string component) ;
-  void printCSwitch(ostream& out, string component) ;
-  void printProfilerH(ostream& out, string component) ;
-  void printProfilerC(ostream& out, string component) ;
-
-  void printHTMLTransitions(ostream& out, int active_state) ;
-
-  // Data Members (m_ prefix)
-  Vector<State*> m_states;
-  Vector<Event*> m_events;
-  Vector<Action*> m_actions;
-  Vector<Transition*> m_transitions;
-  Vector<Func*> m_internal_func_vec;
-
-  Map<State*, int> m_state_map;
-  Map<Event*, int> m_event_map;
-
-  Vector<Var*> m_in_ports;
-
-  Vector<Var*> m_objs;
-
-  // Table variables
-  bool m_table_built;
-  Vector<Vector<Transition*> > m_table;
-
-  //added by SS
-  std::vector<std::string> m_message_buffer_names;
-
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const StateMachine& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const StateMachine& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //STATEMACHINE_H
diff --git a/src/mem/slicc/symbols/StateMachine.py b/src/mem/slicc/symbols/StateMachine.py
new file mode 100644
index 0000000..e54d6a4
--- /dev/null
+++ b/src/mem/slicc/symbols/StateMachine.py
@@ -0,0 +1,1222 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util import code_formatter, orderdict
+
+from slicc.symbols.Symbol import Symbol
+from slicc.symbols.Var import Var
+import slicc.generate.html as html
+
+class StateMachine(Symbol):
+    def __init__(self, symtab, ident, location, pairs, config_parameters):
+        super(StateMachine, self).__init__(symtab, ident, location, pairs)
+        self.table = None
+        self.config_parameters = config_parameters
+        for param in config_parameters:
+            var = Var(symtab, param.name, location, param.type_ast.type,
+                      "m_%s" % param.name, {}, self)
+            self.symtab.registerSym(param.name, var)
+
+        self.states = orderdict()
+        self.events = orderdict()
+        self.actions = orderdict()
+        self.transitions = []
+        self.in_ports = []
+        self.functions = []
+        self.objects = []
+
+        self.message_buffer_names = []
+
+    def __repr__(self):
+        return "[StateMachine: %s]" % self.ident
+
+    def addState(self, state):
+        assert self.table is None
+        self.states[state.ident] = state
+
+    def addEvent(self, event):
+        assert self.table is None
+        self.events[event.ident] = event
+
+    def addAction(self, action):
+        assert self.table is None
+
+        # Check for duplicate action
+        for other in self.actions.itervalues():
+            if action.ident == other.ident:
+                a.warning("Duplicate action definition: %s" % a.ident)
+                action.error("Duplicate action definition: %s" % action.ident)
+            if action.short == other.short:
+                other.warning("Duplicate action shorthand: %s" % other.ident)
+                other.warning("    shorthand = %s" % other.short)
+                action.warning("Duplicate action shorthand: %s" % action.ident)
+                action.error("    shorthand = %s" % action.short)
+
+        self.actions[action.ident] = action
+
+    def addTransition(self, trans):
+        assert self.table is None
+        self.transitions.append(trans)
+
+    def addInPort(self, var):
+        self.in_ports.append(var)
+
+    def addFunc(self, func):
+        # register func in the symbol table
+        self.symtab.registerSym(str(func), func)
+        self.functions.append(func)
+
+    def addObject(self, obj):
+        self.objects.append(obj)
+
+    # Needs to be called before accessing the table
+    def buildTable(self):
+        assert self.table is None
+
+        table = {}
+
+        for trans in self.transitions:
+            # 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.
+
+            for action in trans.actions:
+                action.used = True
+
+            index = (trans.state, trans.event)
+            if index in table:
+                table[index].warning("Duplicate transition: %s" % table[index])
+                trans.error("Duplicate transition: %s" % trans)
+            table[index] = trans
+
+        # Look at all actions to make sure we used them all
+        for action in self.actions.itervalues():
+            if not action.used:
+                error_msg = "Unused action: %s" % action.ident
+                if "desc" in action:
+                    error_msg += ", "  + action.desc
+                action.warning(error_msg)
+        self.table = table
+
+    def writeCodeFiles(self, path):
+        self.printControllerHH(path)
+        self.printControllerCC(path)
+        self.printCSwitch(path)
+        self.printCWakeup(path)
+        self.printProfilerCC(path)
+        self.printProfilerHH(path)
+
+        for func in self.functions:
+            func.writeCodeFiles(path)
+
+    def printControllerHH(self, path):
+        '''Output the method declarations for the class declaration'''
+        code = code_formatter()
+        ident = self.ident
+        c_ident = "%s_Controller" % self.ident
+
+        self.message_buffer_names = []
+
+        code('''
+/** \\file $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
+
+#include "mem/ruby/common/Global.hh"
+#include "mem/ruby/common/Consumer.hh"
+#include "mem/ruby/slicc_interface/AbstractController.hh"
+#include "mem/protocol/TransitionResult.hh"
+#include "mem/protocol/Types.hh"
+#include "mem/protocol/${ident}_Profiler.hh"
+''')
+
+        seen_types = set()
+        for var in self.objects:
+            if var.type.ident not in seen_types:
+                code('#include "mem/protocol/${{var.type.c_ident}}.hh"')
+            seen_types.add(var.type.ident)
+
+        # for adding information to the protocol debug trace
+        code('''
+extern stringstream ${ident}_transitionComment;
+
+class $c_ident : public AbstractController {
+#ifdef CHECK_COHERENCE
+#endif /* CHECK_COHERENCE */
+public:
+    $c_ident(const string & name);
+    static int getNumControllers();
+    void init(Network* net_ptr, const vector<string> & argv);
+    MessageBuffer* getMandatoryQueue() const;
+    const int & getVersion() const;
+    const string toString() const;
+    const string getName() const;
+    const MachineType getMachineType() const;
+    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(); }
+private:
+''')
+
+        code.indent()
+        # added by SS
+        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;
+
+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
+string m_name;
+int m_transitions_per_cycle;
+int m_buffer_size;
+int m_recycle_latency;
+map< string, string > m_cfg;
+NodeID m_version;
+Network* m_net_ptr;
+MachineID m_machineID;
+${ident}_Profiler s_profiler;
+static int m_num_controllers;
+// Internal functions
+''')
+
+        for func in self.functions:
+            proto = func.prototype
+            if proto:
+                code('$proto')
+
+        code('''
+
+// Actions
+''')
+        for action in self.actions.itervalues():
+            code('/** \\brief ${{action.desc}} */')
+            code('void ${{action.ident}}(const Address& addr);')
+
+        # the controller internal variables
+        code('''
+
+// Object
+''')
+        for var in self.objects:
+            th = var.get("template_hack", "")
+            code('${{var.type.c_ident}}$th* m_${{var.c_ident}}_ptr;')
+
+            if var.type.ident == "MessageBuffer":
+                self.message_buffer_names.append("m_%s_ptr" % var.c_ident)
+
+        code.dedent()
+        code('};')
+        code('#endif // ${ident}_CONTROLLER_H')
+        code.write(path, '%s.hh' % c_ident)
+
+    def printControllerCC(self, path):
+        '''Output the actions for performing the actions'''
+
+        code = code_formatter()
+        ident = self.ident
+        c_ident = "%s_Controller" % self.ident
+
+        code('''
+/** \\file $ident.cc
+ *
+ * Auto generated C++ code started by $__file__:$__line__
+ * Created by slicc definition of Module "${{self.short}}"
+ */
+
+#include "mem/ruby/common/Global.hh"
+#include "mem/ruby/slicc_interface/RubySlicc_includes.hh"
+#include "mem/protocol/${ident}_Controller.hh"
+#include "mem/protocol/${ident}_State.hh"
+#include "mem/protocol/${ident}_Event.hh"
+#include "mem/protocol/Types.hh"
+#include "mem/ruby/system/System.hh"
+''')
+
+        # include object classes
+        seen_types = set()
+        for var in self.objects:
+            if var.type.ident not in seen_types:
+                code('#include "mem/protocol/${{var.type.c_ident}}.hh"')
+            seen_types.add(var.type.ident)
+
+        code('''
+int $c_ident::m_num_controllers = 0;
+
+stringstream ${ident}_transitionComment;
+#define APPEND_TRANSITION_COMMENT(str) (${ident}_transitionComment << str)
+/** \\brief constructor */
+$c_ident::$c_ident(const string &name)
+    : m_name(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:
+            if var.ident.find("mandatoryQueue") >= 0:
+                code('m_${{var.c_ident}}_ptr = new ${{var.type.c_ident}}();')
+
+        code.dedent()
+        code('''
+}
+
+void $c_ident::init(Network *net_ptr, const vector<string> &argv)
+{
+    for (size_t i = 0; i < argv.size(); i += 2) {
+        if (argv[i] == "version")
+            m_version = atoi(argv[i+1].c_str());
+        else if (argv[i] == "transitions_per_cycle")
+            m_transitions_per_cycle = atoi(argv[i+1].c_str());
+        else if (argv[i] == "buffer_size")
+            m_buffer_size = atoi(argv[i+1].c_str());
+        else if (argv[i] == "recycle_latency")
+            m_recycle_latency = atoi(argv[i+1].c_str());
+        else if (argv[i] == "number_of_TBEs")
+            m_number_of_TBEs = atoi(argv[i+1].c_str());
+''')
+
+        code.indent()
+        code.indent()
+        for param in self.config_parameters:
+            code('else if (argv[i] == "${{param.name}}")')
+            if param.type_ast.type.ident == "int":
+                code('    m_${{param.name}} = atoi(argv[i+1].c_str());')
+            else:
+                self.error("only int parameters are supported right now")
+        code.dedent()
+        code.dedent()
+        code('''
+    }
+
+    m_net_ptr = net_ptr;
+    m_machineID.type = MachineType_${ident};
+    m_machineID.num = m_version;
+    for (size_t i = 0; i < argv.size(); i += 2) {
+        if (argv[i] != "version")
+            m_cfg[argv[i]] = argv[i+1];
+    }
+
+    // Objects
+    s_profiler.setVersion(m_version);
+''')
+
+        code.indent()
+        for var in self.objects:
+            vtype = var.type
+            vid = "m_%s_ptr" % var.c_ident
+            if "network" not in var:
+                # Not a network port object
+                if "primitive" in vtype:
+                    code('$vid = new ${{vtype.c_ident}};')
+                    if "default" in var:
+                        code('(*$vid) = ${{var["default"]}};')
+                else:
+                    # Normal Object
+                    # added by SS
+                    if "factory" in var:
+                        code('$vid = ${{var["factory"]}};')
+                    elif var.ident.find("mandatoryQueue") < 0:
+                        th = var.get("template_hack", "")
+                        expr = "%s  = new %s%s" % (vid, vtype.c_ident, th)
+
+                        args = ""
+                        if "non_obj" not in vtype and not vtype.isEnumeration:
+                            if expr.find("TBETable") >= 0:
+                                args = "m_number_of_TBEs"
+                            else:
+                                args = var.get("constructor_hack", "")
+                            args = "(%s)" % args
+
+                        code('$expr$args;')
+                    else:
+                        code(';')
+
+                    code('assert($vid != NULL);')
+
+                    if "default" in var:
+                        code('(*$vid) = ${{var["default"]}}; // Object default')
+                    elif "default" in vtype:
+                        code('(*$vid) = ${{vtype["default"]}}; // Type ${{vtype.ident}} default')
+
+                    # Set ordering
+                    if "ordered" in var and "trigger_queue" not in var:
+                        # A buffer
+                        code('$vid->setOrdering(${{var["ordered"]}});')
+
+                    # Set randomization
+                    if "random" in var:
+                        # A buffer
+                        code('$vid->setRandomization(${{var["random"]}});')
+
+                    # Set Priority
+                    if vtype.isBuffer and \
+                           "rank" in var and "trigger_queue" not in var:
+                        code('$vid->setPriority(${{var["rank"]}});')
+            else:
+                # Network port object
+                network = var["network"]
+                ordered =  var["ordered"]
+                vnet = var["virtual_network"]
+
+                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);
+''')
+
+                code('assert($vid != NULL);')
+
+                # Set ordering
+                if "ordered" in var:
+                    # A buffer
+                    code('$vid->setOrdering(${{var["ordered"]}});')
+
+                # Set randomization
+                if "random" in var:
+                    # A buffer
+                    code('$vid->setRandomization(${{var["random"]}})')
+
+                # Set Priority
+                if "rank" in var:
+                    code('$vid->setPriority(${{var["rank"]}})')
+
+                # Set buffer size
+                if vtype.isBuffer:
+                    code('''
+if (m_buffer_size > 0) {
+    $vid->setSize(m_buffer_size);
+}
+''')
+
+                # set description (may be overriden later by port def)
+                code('$vid->setDescription("[Version " + int_to_string(m_version) + ", ${ident}, name=${{var.c_ident}}]");')
+
+        # Set the queue consumers
+        code.insert_newline()
+        for port in self.in_ports:
+            code('${{port.code}}.setConsumer(this);')
+
+        # Set the queue descriptions
+        code.insert_newline()
+        for port in self.in_ports:
+            code('${{port.code}}.setDescription("[Version " + int_to_string(m_version) + ", $ident, $port]");')
+
+        # Initialize the transition profiling
+        code.insert_newline()
+        for trans in self.transitions:
+            # Figure out if we stall
+            stall = False
+            for action in trans.actions:
+                if action.ident == "z_stall":
+                    stall = True
+
+            # Only possible if it is not a 'z' case
+            if not stall:
+                state = "%s_State_%s" % (self.ident, trans.state.ident)
+                event = "%s_Event_%s" % (self.ident, trans.event.ident)
+                code('s_profiler.possibleTransition($state, $event);')
+
+        # added by SS to initialize recycle_latency of message buffers
+        for buf in self.message_buffer_names:
+            code("$buf->setRecycleLatency(m_recycle_latency);")
+
+        code.dedent()
+        code('}')
+
+        has_mandatory_q = False
+        for port in self.in_ports:
+            if port.code.find("mandatoryQueue_ptr") >= 0:
+                has_mandatory_q = True
+
+        if has_mandatory_q:
+            mq_ident = "m_%s_mandatoryQueue_ptr" % self.ident
+        else:
+            mq_ident = "NULL"
+
+        code('''
+int $c_ident::getNumControllers() {
+    return m_num_controllers;
+}
+
+MessageBuffer* $c_ident::getMandatoryQueue() const {
+    return $mq_ident;
+}
+
+const int & $c_ident::getVersion() const{
+    return m_version;
+}
+
+const string $c_ident::toString() const{
+    return "$c_ident";
+}
+
+const string $c_ident::getName() const{
+    return m_name;
+}
+const MachineType $c_ident::getMachineType() const{
+    return MachineType_${ident};
+}
+
+void $c_ident::print(ostream& out) const { out << "[$c_ident " << m_version << "]"; }
+
+void $c_ident::printConfig(ostream& out) const {
+    out << "$c_ident config: " << m_name << endl;
+    out << "  version: " << m_version << endl;
+    for (map<string, string>::const_iterator it = m_cfg.begin(); it != m_cfg.end(); it++) {
+        out << "  " << (*it).first << ": " << (*it).second << endl;
+    }
+}
+
+// Actions
+''')
+
+        for action in self.actions.itervalues():
+            if "c_code" not in action:
+                continue
+
+            code('''
+/** \\brief ${{action.desc}} */
+void $c_ident::${{action.ident}}(const Address& addr)
+{
+    DEBUG_MSG(GENERATED_COMP, HighPrio, "executing");
+    ${{action["c_code"]}}
+}
+
+''')
+        code.write(path, "%s.cc" % c_ident)
+
+    def printCWakeup(self, path):
+        '''Output the wakeup loop for the events'''
+
+        code = code_formatter()
+        ident = self.ident
+
+        code('''
+// Auto generated C++ code started by $__file__:$__line__
+// ${ident}: ${{self.short}}
+
+#include "mem/ruby/common/Global.hh"
+#include "mem/ruby/slicc_interface/RubySlicc_includes.hh"
+#include "mem/protocol/${ident}_Controller.hh"
+#include "mem/protocol/${ident}_State.hh"
+#include "mem/protocol/${ident}_Event.hh"
+#include "mem/protocol/Types.hh"
+#include "mem/ruby/system/System.hh"
+
+void ${ident}_Controller::wakeup()
+{
+
+    int counter = 0;
+    while (true) {
+        // Some cases will put us into an infinite loop without this limit
+        assert(counter <= m_transitions_per_cycle);
+        if (counter == m_transitions_per_cycle) {
+            g_system_ptr->getProfiler()->controllerBusy(m_machineID); // Count how often we\'re fully utilized
+            g_eventQueue_ptr->scheduleEvent(this, 1); // Wakeup in another cycle and try again
+            break;
+        }
+''')
+
+        code.indent()
+        code.indent()
+
+        # 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()
+        code.dedent()
+        code('''
+        break;  // If we got this far, we have nothing left todo
+    }
+}
+''')
+
+        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):
+        '''Output switch statement for transition table'''
+
+        code = code_formatter()
+        ident = self.ident
+
+        code('''
+// Auto generated C++ code started by $__file__:$__line__
+// ${ident}: ${{self.short}}
+
+#include "mem/ruby/common/Global.hh"
+#include "mem/protocol/${ident}_Controller.hh"
+#include "mem/protocol/${ident}_State.hh"
+#include "mem/protocol/${ident}_Event.hh"
+#include "mem/protocol/Types.hh"
+#include "mem/ruby/system/System.hh"
+
+#define HASH_FUN(state, event)  ((int(state)*${ident}_Event_NUM)+int(event))
+
+#define GET_TRANSITION_COMMENT() (${ident}_transitionComment.str())
+#define CLEAR_TRANSITION_COMMENT() (${ident}_transitionComment.str(""))
+
+TransitionResult ${ident}_Controller::doTransition(${ident}_Event event, ${ident}_State state, const Address& addr
+)
+{
+    ${ident}_State next_state = state;
+
+    DEBUG_NEWLINE(GENERATED_COMP, MedPrio);
+    DEBUG_MSG(GENERATED_COMP, MedPrio, *this);
+    DEBUG_EXPR(GENERATED_COMP, MedPrio, g_eventQueue_ptr->getTime());
+    DEBUG_EXPR(GENERATED_COMP, MedPrio,state);
+    DEBUG_EXPR(GENERATED_COMP, MedPrio,event);
+    DEBUG_EXPR(GENERATED_COMP, MedPrio,addr);
+
+    TransitionResult result = doTransitionWorker(event, state, next_state, addr);
+
+    if (result == TransitionResult_Valid) {
+        DEBUG_EXPR(GENERATED_COMP, MedPrio, next_state);
+        DEBUG_NEWLINE(GENERATED_COMP, MedPrio);
+        s_profiler.countTransition(state, event);
+        if (Debug::getProtocolTrace()) {
+            g_system_ptr->getProfiler()->profileTransition("${ident}", m_version, addr,
+                    ${ident}_State_to_string(state),
+                    ${ident}_Event_to_string(event),
+                    ${ident}_State_to_string(next_state), GET_TRANSITION_COMMENT());
+        }
+    CLEAR_TRANSITION_COMMENT();
+    ${ident}_setState(addr, next_state);
+
+    } else if (result == TransitionResult_ResourceStall) {
+        if (Debug::getProtocolTrace()) {
+            g_system_ptr->getProfiler()->profileTransition("${ident}", m_version, addr,
+                   ${ident}_State_to_string(state),
+                   ${ident}_Event_to_string(event),
+                   ${ident}_State_to_string(next_state),
+                   "Resource Stall");
+        }
+    } else if (result == TransitionResult_ProtocolStall) {
+        DEBUG_MSG(GENERATED_COMP, HighPrio, "stalling");
+        DEBUG_NEWLINE(GENERATED_COMP, MedPrio);
+        if (Debug::getProtocolTrace()) {
+            g_system_ptr->getProfiler()->profileTransition("${ident}", m_version, addr,
+                   ${ident}_State_to_string(state),
+                   ${ident}_Event_to_string(event),
+                   ${ident}_State_to_string(next_state),
+                   "Protocol Stall");
+        }
+    }
+
+    return result;
+}
+
+TransitionResult ${ident}_Controller::doTransitionWorker(${ident}_Event event, ${ident}_State state, ${ident}_State& next_state, const Address& addr
+)
+{
+    switch(HASH_FUN(state, event)) {
+''')
+
+        # This map will allow suppress generating duplicate code
+        cases = orderdict()
+
+        for trans in self.transitions:
+            case_string = "%s_State_%s, %s_Event_%s" % \
+                (self.ident, trans.state.ident, self.ident, trans.event.ident)
+
+            case = code_formatter()
+            # Only set next_state if it changes
+            if trans.state != trans.nextState:
+                ns_ident = trans.nextState.ident
+                case('next_state = ${ident}_State_${ns_ident};')
+
+            actions = trans.actions
+
+            # Check for resources
+            case_sorter = []
+            res = trans.resources
+            for key,val in res.iteritems():
+                if key.type.ident != "DNUCAStopTable":
+                    val = '''
+if (!%s.areNSlotsAvailable(%s)) {
+    return TransitionResult_ResourceStall;
+}
+''' % (key.code, val)
+                case_sorter.append(val)
+
+
+            # 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
+            for c in sorted(case_sorter):
+                case("$c")
+
+            # Figure out if we stall
+            stall = False
+            for action in actions:
+                if action.ident == "z_stall":
+                    stall = True
+                    break
+
+            if stall:
+                case('return TransitionResult_ProtocolStall;')
+            else:
+                for action in actions:
+                    case('${{action.ident}}(addr);')
+                case('return TransitionResult_Valid;')
+
+            case = str(case)
+
+            # Look to see if this transition code is unique.
+            if case not in cases:
+                cases[case] = []
+
+            cases[case].append(case_string)
+
+        # Walk through all of the unique code blocks and spit out the
+        # corresponding case statement elements
+        for case,transitions in cases.iteritems():
+            # Iterative over all the multiple transitions that share
+            # the same code
+            for trans in transitions:
+                code('  case HASH_FUN($trans):')
+            code('  {')
+            code('    $case')
+            code('  }')
+
+        code('''
+      default:
+        WARN_EXPR(m_version);
+        WARN_EXPR(g_eventQueue_ptr->getTime());
+        WARN_EXPR(addr);
+        WARN_EXPR(event);
+        WARN_EXPR(state);
+        ERROR_MSG(\"Invalid transition\");
+    }
+    return TransitionResult_Valid;
+}
+''')
+        code.write(path, "%s_Transitions.cc" % self.ident)
+
+    def printProfilerHH(self, path):
+        code = code_formatter()
+        ident = self.ident
+
+        code('''
+// Auto generated C++ code started by $__file__:$__line__
+// ${ident}: ${{self.short}}
+
+#ifndef ${ident}_PROFILER_H
+#define ${ident}_PROFILER_H
+
+#include "mem/ruby/common/Global.hh"
+#include "mem/protocol/${ident}_State.hh"
+#include "mem/protocol/${ident}_Event.hh"
+
+class ${ident}_Profiler {
+  public:
+    ${ident}_Profiler();
+    void setVersion(int version);
+    void countTransition(${ident}_State state, ${ident}_Event event);
+    void possibleTransition(${ident}_State state, ${ident}_Event event);
+    void dumpStats(ostream& out) const;
+    void clearStats();
+
+  private:
+    int m_counters[${ident}_State_NUM][${ident}_Event_NUM];
+    int m_event_counters[${ident}_Event_NUM];
+    bool m_possible[${ident}_State_NUM][${ident}_Event_NUM];
+    int m_version;
+};
+
+#endif // ${ident}_PROFILER_H
+''')
+        code.write(path, "%s_Profiler.hh" % self.ident)
+
+    def printProfilerCC(self, path):
+        code = code_formatter()
+        ident = self.ident
+
+        code('''
+// Auto generated C++ code started by $__file__:$__line__
+// ${ident}: ${{self.short}}
+
+#include "mem/protocol/${ident}_Profiler.hh"
+
+${ident}_Profiler::${ident}_Profiler()
+{
+    for (int state = 0; state < ${ident}_State_NUM; state++) {
+        for (int event = 0; event < ${ident}_Event_NUM; event++) {
+            m_possible[state][event] = false;
+            m_counters[state][event] = 0;
+        }
+    }
+    for (int event = 0; event < ${ident}_Event_NUM; event++) {
+        m_event_counters[event] = 0;
+    }
+}
+void ${ident}_Profiler::setVersion(int version)
+{
+    m_version = version;
+}
+void ${ident}_Profiler::clearStats()
+{
+    for (int state = 0; state < ${ident}_State_NUM; state++) {
+        for (int event = 0; event < ${ident}_Event_NUM; event++) {
+            m_counters[state][event] = 0;
+        }
+    }
+
+    for (int event = 0; event < ${ident}_Event_NUM; event++) {
+        m_event_counters[event] = 0;
+    }
+}
+void ${ident}_Profiler::countTransition(${ident}_State state, ${ident}_Event event)
+{
+    assert(m_possible[state][event]);
+    m_counters[state][event]++;
+    m_event_counters[event]++;
+}
+void ${ident}_Profiler::possibleTransition(${ident}_State state, ${ident}_Event event)
+{
+    m_possible[state][event] = true;
+}
+void ${ident}_Profiler::dumpStats(ostream& out) const
+{
+    out << " --- ${ident} " << m_version << " ---" << endl;
+    out << " - Event Counts -" << endl;
+    for (int event = 0; event < ${ident}_Event_NUM; event++) {
+        int count = m_event_counters[event];
+        out << (${ident}_Event) event << "  " << count << endl;
+    }
+    out << endl;
+    out << " - Transitions -" << endl;
+    for (int state = 0; state < ${ident}_State_NUM; state++) {
+        for (int event = 0; event < ${ident}_Event_NUM; event++) {
+            if (m_possible[state][event]) {
+                int count = m_counters[state][event];
+                out << (${ident}_State) state << "  " << (${ident}_Event) event << "  " << count;
+                if (count == 0) {
+                    out << " <-- ";
+                }
+                out << endl;
+            }
+        }
+        out << endl;
+    }
+}
+''')
+        code.write(path, "%s_Profiler.cc" % self.ident)
+
+    # **************************
+    # ******* HTML Files *******
+    # **************************
+    def frameRef(self, click_href, click_target, over_href, over_target_num,
+                 text):
+        code = code_formatter(fix_newlines=False)
+        code("""<A href=\"$click_href\" target=\"$click_target\" onMouseOver=\"if (parent.frames[$over_target_num].location != parent.location + '$over_href') { parent.frames[$over_target_num].location='$over_href' }\" >${{html.formatShorthand(text)}}</A>""")
+        return str(code)
+
+    def writeHTMLFiles(self, path):
+        # Create table with no row hilighted
+        self.printHTMLTransitions(path, None)
+
+        # Generate transition tables
+        for state in self.states.itervalues():
+            self.printHTMLTransitions(path, state)
+
+        # Generate action descriptions
+        for action in self.actions.itervalues():
+            name = "%s_action_%s.html" % (self.ident, action.ident)
+            code = html.createSymbol(action, "Action")
+            code.write(path, name)
+
+        # Generate state descriptions
+        for state in self.states.itervalues():
+            name = "%s_State_%s.html" % (self.ident, state.ident)
+            code = html.createSymbol(state, "State")
+            code.write(path, name)
+
+        # Generate event descriptions
+        for event in self.events.itervalues():
+            name = "%s_Event_%s.html" % (self.ident, event.ident)
+            code = html.createSymbol(event, "Event")
+            code.write(path, name)
+
+    def printHTMLTransitions(self, path, active_state):
+        code = code_formatter()
+
+        code('''
+<HTML><BODY link="blue" vlink="blue">
+
+<H1 align="center">${{html.formatShorthand(self.short)}}:
+''')
+        code.indent()
+        for i,machine in enumerate(self.symtab.getAllType(StateMachine)):
+            mid = machine.ident
+            if i != 0:
+                extra = " - "
+            else:
+                extra = ""
+            if machine == self:
+                code('$extra$mid')
+            else:
+                code('$extra<A target="Table" href="${mid}_table.html">$mid</A>')
+        code.dedent()
+
+        code("""
+</H1>
+
+<TABLE border=1>
+<TR>
+  <TH> </TH>
+""")
+
+        for event in self.events.itervalues():
+            href = "%s_Event_%s.html" % (self.ident, event.ident)
+            ref = self.frameRef(href, "Status", href, "1", event.short)
+            code('<TH bgcolor=white>$ref</TH>')
+
+        code('</TR>')
+        # -- Body of table
+        for state in self.states.itervalues():
+            # -- Each row
+            if state == active_state:
+                color = "yellow"
+            else:
+                color = "white"
+
+            click = "%s_table_%s.html" % (self.ident, state.ident)
+            over = "%s_State_%s.html" % (self.ident, state.ident)
+            text = html.formatShorthand(state.short)
+            ref = self.frameRef(click, "Table", over, "1", state.short)
+            code('''
+<TR>
+  <TH bgcolor=$color>$ref</TH>
+''')
+
+            # -- One column for each event
+            for event in self.events.itervalues():
+                trans = self.table.get((state,event), None)
+                if trans is None:
+                    # This is the no transition case
+                    if state == active_state:
+                        color = "#C0C000"
+                    else:
+                        color = "lightgrey"
+
+                    code('<TD bgcolor=$color>&nbsp;</TD>')
+                    continue
+
+                next = trans.nextState
+                stall_action = False
+
+                # -- Get the actions
+                for action in trans.actions:
+                    if action.ident == "z_stall" or \
+                       action.ident == "zz_recycleMandatoryQueue":
+                        stall_action = True
+
+                # -- Print out "actions/next-state"
+                if stall_action:
+                    if state == active_state:
+                        color = "#C0C000"
+                    else:
+                        color = "lightgrey"
+
+                elif active_state and next.ident == active_state.ident:
+                    color = "aqua"
+                elif state == active_state:
+                    color = "yellow"
+                else:
+                    color = "white"
+
+                fix = code.nofix()
+                code('<TD bgcolor=$color>')
+                for action in trans.actions:
+                    href = "%s_action_%s.html" % (self.ident, action.ident)
+                    ref = self.frameRef(href, "Status", href, "1",
+                                        action.short)
+                    code('  $ref\n')
+                if next != state:
+                    if trans.actions:
+                        code('/')
+                    click = "%s_table_%s.html" % (self.ident, next.ident)
+                    over = "%s_State_%s.html" % (self.ident, next.ident)
+                    ref = self.frameRef(click, "Table", over, "1", next.short)
+                    code("$ref")
+                code("</TD>\n")
+                code.fix(fix)
+
+            # -- Each row
+            if state == active_state:
+                color = "yellow"
+            else:
+                color = "white"
+
+            click = "%s_table_%s.html" % (self.ident, state.ident)
+            over = "%s_State_%s.html" % (self.ident, state.ident)
+            ref = self.frameRef(click, "Table", over, "1", state.short)
+            code('''
+  <TH bgcolor=$color>$ref</TH>
+</TR>
+''')
+        code('''
+<TR>
+  <TH> </TH>
+''')
+
+        for event in self.events.itervalues():
+            href = "%s_Event_%s.html" % (self.ident, event.ident)
+            ref = self.frameRef(href, "Status", href, "1", event.short)
+            code('<TH bgcolor=white>$ref</TH>')
+        code('''
+</TR>
+</TABLE>
+</BODY></HTML>
+''')
+
+
+        if active_state:
+            name = "%s_table_%s.html" % (self.ident, active_state.ident)
+        else:
+            name = "%s_table.html" % self.ident
+        code.write(path, name)
+
+__all__ = [ "StateMachine" ]
diff --git a/src/mem/slicc/symbols/Symbol.cc b/src/mem/slicc/symbols/Symbol.cc
deleted file mode 100644
index 25af5ad..0000000
--- a/src/mem/slicc/symbols/Symbol.cc
+++ /dev/null
@@ -1,72 +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/Symbol.hh"
-
-Symbol::Symbol(string id, const Location& location, const Map<string, string>& pairs)
-{
-  m_id = id;
-  m_location = location;
-  m_pairs = pairs;
-  if (!existPair("short")) {
-    addPair("short", m_id);
-  }
-  m_used = false;
-}
-
-Symbol::Symbol(string id, const Location& location)
-{
-  m_id = id;
-  m_location = location;
-  if (!existPair("short")) {
-    addPair("short", m_id);
-  }
-  m_used = false;
-}
-
-const string& Symbol::lookupPair(const string& key) const
-{
-  if (!existPair(key)) {
-    error("Value for pair '" + key + "' missing.");
-  }
-  return m_pairs.lookup(key);
-}
-
-void Symbol::addPair(const string& key, const string& value)
-{
-  if (existPair(key)) {
-    warning("Pair key '" + key + "' re-defined. new: '" + value + "' old: '" + lookupPair(key) + "'");
-  }
-  m_pairs.add(key, value);
-}
diff --git a/src/mem/slicc/symbols/Symbol.hh b/src/mem/slicc/symbols/Symbol.hh
deleted file mode 100644
index 4a1c5e4..0000000
--- a/src/mem/slicc/symbols/Symbol.hh
+++ /dev/null
@@ -1,100 +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$
- */
-
-#ifndef SYMBOL_H
-#define SYMBOL_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/gems_common/Map.hh"
-#include "mem/slicc/ast/Location.hh"
-
-class Symbol {
-public:
-  // Constructors
-  Symbol(string id, const Location& location, const Map<string, string>& pairs);
-  Symbol(string id, const Location& location);
-  // Destructor
-  virtual ~Symbol() { }
-
-  // Public Methods
-  void error(string err_msg) const { m_location.error(err_msg); }
-  void warning(string err_msg) const { m_location.warning(err_msg); }
-  const Location& getLocation() const { return m_location; }
-
-  const string& toString() const { return m_id; }
-
-  const string& getIdent() const { return m_id; }
-  const string& getShorthand() const { return lookupPair("short"); }
-  const string& getDescription() const { return lookupPair("desc"); }
-
-  void markUsed() { m_used = true; }
-  bool wasUsed() { return m_used; }
-
-  bool existPair(const string& key) const { return m_pairs.exist(key); }
-  const string& lookupPair(const string& key) const;
-  void addPair(const string& key, const string& value);
-
-  //  virtual string getCode() const = 0;
-  virtual void writeCFiles(string path)  {}
-  virtual void writeHTMLFiles(string path)  {}
-  virtual void print(ostream& out) const { out << "[Symbol: " << getIdent() << "]"; }
-
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  // Symbol(const Symbol& obj);
-  // Symbol& operator=(const Symbol& obj);
-
-  // Data Members (m_ prefix)
-  string m_id;
-  Map<string, string> m_pairs;
-  Location m_location;
-  bool m_used;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const Symbol& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const Symbol& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //SYMBOL_H
diff --git a/src/mem/slicc/symbols/Symbol.py b/src/mem/slicc/symbols/Symbol.py
new file mode 100644
index 0000000..b394fda
--- /dev/null
+++ b/src/mem/slicc/symbols/Symbol.py
@@ -0,0 +1,78 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.util import PairContainer
+
+class Symbol(PairContainer):
+    def __init__(self, symtab, ident, location, pairs=None):
+        super(Symbol, self).__init__()
+
+        from slicc.util import Location
+        from slicc.symbols import SymbolTable
+        if not isinstance(symtab, SymbolTable): raise AttributeError
+        if not isinstance(ident, str): raise AttributeError
+        if not isinstance(location, Location): raise AttributeError
+
+        self.symtab = symtab
+        self.ident = ident
+        self.location = location
+        if pairs:
+            self.pairs.update(getattr(pairs, "pairs", pairs))
+        if "short" not in self:
+            self["short"] = self.ident
+        self.used = False
+
+    def __repr__(self):
+        return "[Symbol: %s]" % self.ident
+
+    def __str__(self):
+        return str(self.ident)
+
+    def __setitem__(self, key, value):
+        if key in self.pairs:
+            self.warning("Pair key '%s' re-defined. new: '%s' old: '%s'",
+                         key, value, self.pairs[key])
+        super(Symbol, self).__setitem__(key, value)
+
+    @property
+    def short(self):
+        return self["short"]
+
+    @property
+    def desc(self):
+        return self["desc"]
+
+    def error(self, message, *args):
+        self.location.error(message, *args)
+
+    def warning(self, message, *args):
+        self.location.warning(message, *args)
+
+    def writeHTMLFiles(self, path):
+        pass
+
+__all__ = [ "Symbol" ]
diff --git a/src/mem/slicc/symbols/SymbolTable.cc b/src/mem/slicc/symbols/SymbolTable.cc
deleted file mode 100644
index 8af3685..0000000
--- a/src/mem/slicc/symbols/SymbolTable.cc
+++ /dev/null
@@ -1,327 +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.
- */
-
-/*
- * SymbolTable.cc
- *
- * Description: See SymbolTable.hh
- *
- * $Id$
- *
- * */
-
-#include "mem/slicc/symbols/SymbolTable.hh"
-#include "mem/slicc/generator/fileio.hh"
-#include "mem/slicc/generator/html_gen.hh"
-#include "mem/slicc/generator/mif_gen.hh"
-#include "mem/slicc/symbols/Action.hh"
-
-SymbolTable g_sym_table;
-
-SymbolTable::SymbolTable()
-{
-  m_sym_map_vec.setSize(1);
-  m_depth = 0;
-
-  {
-    Map<string, string> pairs;
-    pairs.add("enumeration", "yes");
-    newSym(new Type("MachineType", Location(), pairs));
-  }
-
-  {
-    Map<string, string> pairs;
-    pairs.add("primitive", "yes");
-    pairs.add("external", "yes");
-    newSym(new Type("void", Location(), pairs));
-  }
-}
-
-SymbolTable::~SymbolTable()
-{
-  int size = m_sym_vec.size();
-  for(int i=0; i<size; i++) {
-    delete m_sym_vec[i];
-  }
-}
-
-void SymbolTable::newSym(Symbol* sym_ptr)
-{
-  registerSym(sym_ptr->toString(), sym_ptr);
-  m_sym_vec.insertAtBottom(sym_ptr);  // Holder for the allocated Sym objects.
-}
-
-void SymbolTable::newMachComponentSym(Symbol* sym_ptr)
-{
-  // used to cheat-- that is, access components in other machines
-  StateMachine* mach_ptr = getStateMachine("current_machine");
-  if (mach_ptr != NULL) {
-    m_machine_component_map_vec.lookup(mach_ptr->toString()).add(sym_ptr->toString(), sym_ptr);
-  }
-}
-
-Var* SymbolTable::getMachComponentVar(string mach, string ident)
-{
-  Symbol* s = m_machine_component_map_vec.lookup(mach).lookup(ident);
-  return dynamic_cast<Var*>(s);
-}
-
-
-void SymbolTable::registerSym(string id, Symbol* sym_ptr)
-{
-
-  // Check for redeclaration (in the current frame only)
-  if (m_sym_map_vec[m_depth].exist(id)) {
-    sym_ptr->error("Symbol '" + id + "' redeclared in same scope.");
-  }
-  // FIXME - warn on masking of a declaration in a previous frame
-  m_sym_map_vec[m_depth].add(id, sym_ptr);
-}
-
-void SymbolTable::registerGlobalSym(string id, Symbol* sym_ptr)
-{
-  // Check for redeclaration (global frame only)
-  if (m_sym_map_vec[0].exist(id)) {
-    sym_ptr->error("Global symbol '" + id + "' redeclared in global scope.");
-  }
-  m_sym_map_vec[0].add(id, sym_ptr);
-}
-
-Symbol* SymbolTable::getSym(string ident) const
-{
-  for (int i=m_depth; i>=0; i--) {
-    if (m_sym_map_vec[i].exist(ident)) {
-      return m_sym_map_vec[i].lookup(ident);
-    }
-  }
-  return NULL;
-}
-
-void SymbolTable::newCurrentMachine(StateMachine* sym_ptr)
-{
-  registerGlobalSym(sym_ptr->toString(), sym_ptr);
-  registerSym("current_machine", sym_ptr);
-  m_sym_vec.insertAtBottom(sym_ptr);  // Holder for the allocated Sym objects.
-
-  Map<string, Symbol*> m;
-  m_machine_component_map_vec.add(sym_ptr->toString(),m);
-
-}
-
-Type* SymbolTable::getType(string ident) const
-{
-  return dynamic_cast<Type*>(getSym(ident));
-}
-
-Var* SymbolTable::getVar(string ident) const
-{
-  return dynamic_cast<Var*>(getSym(ident));
-}
-
-Func* SymbolTable::getFunc(string ident) const
-{
-  return dynamic_cast<Func*>(getSym(ident));
-}
-
-StateMachine* SymbolTable::getStateMachine(string ident) const
-{
-  return dynamic_cast<StateMachine*>(getSym(ident));
-}
-
-void SymbolTable::pushFrame()
-{
-  m_depth++;
-  m_sym_map_vec.expand(1);
-  m_sym_map_vec[m_depth].clear();
-}
-
-void SymbolTable::popFrame()
-{
-  m_depth--;
-  assert(m_depth >= 0);
-  m_sym_map_vec.expand(-1);
-}
-
-void SymbolTable::writeCFiles(string path) const
-{
-  int size = m_sym_vec.size();
-  {
-    // Write the Types.hh include file for the types
-    ostringstream sstr;
-    sstr << "/** Auto generated C++ code started by "<<__FILE__<<":"<<__LINE__<< " */" << endl;
-    sstr << endl;
-    sstr << "#include \"mem/ruby/slicc_interface/RubySlicc_includes.hh\"" << endl;
-    for(int i=0; i<size; i++) {
-      Type* type = dynamic_cast<Type*>(m_sym_vec[i]);
-      if (type != NULL && !type->isPrimitive()) {
-        sstr << "#include \"mem/protocol/" << type->cIdent() << ".hh" << "\"" << endl;
-      }
-    }
-    conditionally_write_file(path + "/Types.hh", sstr);
-  }
-
-  // Write all the symbols
-  for(int i=0; i<size; i++) {
-    m_sym_vec[i]->writeCFiles(path + '/');
-  }
-
-  writeControllerFactory(path);
-}
-
-void SymbolTable::writeControllerFactory(string path) const
-{
-  ostringstream sstr;
-  int size = m_sym_vec.size();
-
-  sstr << "/** \\file ControllerFactory.hh " << endl;
-  sstr << "  * Auto generatred C++ code started by " << __FILE__ << ":" << __LINE__ << endl;
-  sstr << "  */" << endl << endl;
-
-  sstr << "#ifndef CONTROLLERFACTORY_H" << endl;
-  sstr << "#define CONTROLLERFACTORY_H" << endl;
-  sstr << endl;
-
-  Vector< string > controller_types;
-
-  // includes
-  sstr << "#include <string>" << endl;
-  sstr << "class Network;" << endl;
-  sstr << "class AbstractController;" << endl;
-  sstr << endl;
-
-  sstr << "class ControllerFactory {" << endl;
-  sstr << "public:" << endl;
-  sstr << "  static AbstractController* createController(const std::string & controller_type, const std::string & name);" << endl;
-  sstr << "};" << endl;
-  sstr << endl;
-
-  sstr << "#endif // CONTROLLERFACTORY_H" << endl;
-  conditionally_write_file(path + "/ControllerFactory.hh", sstr);
-
-  // ControllerFactory.cc file
-
-  sstr.str("");
-
-  sstr << "/** \\file ControllerFactory.cc " << endl;
-  sstr << "  * Auto generatred C++ code started by " << __FILE__ << ":" << __LINE__ << endl;
-  sstr << "  */" << endl << endl;
-
-  // includes
-  sstr << "#include \"mem/protocol/ControllerFactory.hh\"" << endl;
-  sstr << "#include \"mem/ruby/slicc_interface/AbstractController.hh\"" << endl;
-  sstr << "#include \"mem/protocol/MachineType.hh\"" << endl;
-  for(int i=0; i<size; i++) {
-    StateMachine* machine = dynamic_cast<StateMachine*>(m_sym_vec[i]);
-    if (machine != NULL) {
-      sstr << "#include \"mem/protocol/" << machine->getIdent() << "_Controller.hh\"" << endl;
-      controller_types.insertAtBottom(machine->getIdent());
-    }
-  }
-  sstr << endl;
-
-  sstr << "AbstractController* ControllerFactory::createController(const std::string & controller_type, const std::string & name) {" << endl;
-  for (int i=0;i<controller_types.size();i++) {
-    sstr << "    if (controller_type == \"" << controller_types[i] << "\")" << endl;
-    sstr << "      return new " << controller_types[i] << "_Controller(name);" << endl;
-  }
-  sstr << "  assert(0); // invalid controller type" << endl;
-  sstr << "  return NULL;" << endl;
-  sstr << "}" << endl;
-  conditionally_write_file(path + "/ControllerFactory.cc", sstr);
-}
-
-Vector<StateMachine*> SymbolTable::getStateMachines() const
-{
-  Vector<StateMachine*> machine_vec;
-  int size = m_sym_vec.size();
-  for(int i=0; i<size; i++) {
-    StateMachine* type = dynamic_cast<StateMachine*>(m_sym_vec[i]);
-    if (type != NULL) {
-      machine_vec.insertAtBottom(type);
-    }
-  }
-  return machine_vec;
-}
-
-void SymbolTable::writeHTMLFiles(string path) const
-{
-  // Create index.html
-  {
-    ostringstream out;
-    createHTMLindex(path, out);
-    conditionally_write_file(path + "index.html", out);
-  }
-
-  // Create empty.html
-  {
-    ostringstream out;
-    out << "<HTML></HTML>";
-    conditionally_write_file(path + "empty.html", out);
-  }
-
-  // Write all the symbols
-  int size = m_sym_vec.size();
-  for(int i=0; i<size; i++) {
-    m_sym_vec[i]->writeHTMLFiles(path);
-  }
-}
-
-void write_file(string filename, ostringstream& sstr)
-{
-  ofstream out;
-
-  out.open(filename.c_str());
-  out << sstr.str();
-  out.close();
-}
-
-void SymbolTable::writeMIFFiles(string path) const
-{
-  int size = m_sym_vec.size();
-  for(int i=0; i<size; i++) {
-    ostringstream states, events, actions, transitions;
-    StateMachine* machine = dynamic_cast<StateMachine*>(m_sym_vec[i]);
-    if (machine != NULL) {
-      printStateTableMIF(*machine, states);
-      write_file(path + machine->getIdent() + "_states.mif", states);
-      printEventTableMIF(*machine, events);
-      write_file(path + machine->getIdent() + "_events.mif", events);
-      printActionTableMIF(*machine, actions);
-      write_file(path + machine->getIdent() + "_actions.mif", actions);
-      printTransitionTableMIF(*machine, transitions);
-      write_file(path + machine->getIdent() + "_transitions.mif", transitions);
-    }
-  }
-}
-
-
-void SymbolTable::print(ostream& out) const
-{
-  out << "[SymbolTable]";  // FIXME
-}
diff --git a/src/mem/slicc/symbols/SymbolTable.hh b/src/mem/slicc/symbols/SymbolTable.hh
deleted file mode 100644
index 90d3f48..0000000
--- a/src/mem/slicc/symbols/SymbolTable.hh
+++ /dev/null
@@ -1,121 +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.
- */
-
-/*
- * SymbolTable.hh
- *
- * Description:
- *
- * $Id$
- *
- * */
-
-#ifndef SYMBOLTABLE_H
-#define SYMBOLTABLE_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/gems_common/Map.hh"
-#include "mem/gems_common/Vector.hh"
-
-#include "mem/slicc/symbols/Symbol.hh"
-#include "mem/slicc/symbols/Type.hh"
-#include "mem/slicc/symbols/Var.hh"
-#include "mem/slicc/symbols/Func.hh"
-#include "mem/slicc/symbols/StateMachine.hh"
-
-class SymbolTable;
-
-extern SymbolTable g_sym_table;
-
-class SymbolTable {
-public:
-  // Constructors
-  SymbolTable();
-
-  // Destructor
-  ~SymbolTable();
-
-  // Public Methods
-  void newSym(Symbol* sym_ptr);
-  void registerSym(string id, Symbol* sym_ptr);
-  Symbol* getSym(string id) const;
-
-  // used to cheat-- that is, access components in other machines
-  void newMachComponentSym(Symbol* sym_ptr);
-  Var* getMachComponentVar(string mach, string ident);
-
-  void newCurrentMachine(StateMachine* machine_ptr);
-  StateMachine* getStateMachine(string ident) const;
-  StateMachine* getStateMachine() const { return getStateMachine("current_machine"); }
-  Type* getType(string ident) const;
-
-  Var* getVar(string ident) const;
-  Func* getFunc(string ident) const;
-
-  void pushFrame();
-  void popFrame();
-
-  Vector<StateMachine*> getStateMachines() const;
-
-  void writeCFiles(string path) const;
-  void writeHTMLFiles(string path) const;
-  void writeMIFFiles(string path) const;
-
-  void print(ostream& out) const;
-private:
-  // Private Methods
-  void registerGlobalSym(string id, Symbol* sym_ptr);
-  void writeControllerFactory(string path) const;
-
-  // Private copy constructor and assignment operator
-  SymbolTable(const SymbolTable& obj);
-  SymbolTable& operator=(const SymbolTable& obj);
-
-  // Data Members (m_ prefix)
-  Vector<Symbol*> m_sym_vec;
-  Vector<Map<string, Symbol*> > m_sym_map_vec;
-  Map<string, Map<string, Symbol*> > m_machine_component_map_vec;
-  int m_depth;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const SymbolTable& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const SymbolTable& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //SYMBOLTABLE_H
diff --git a/src/mem/slicc/symbols/SymbolTable.py b/src/mem/slicc/symbols/SymbolTable.py
new file mode 100644
index 0000000..17d7dfa
--- /dev/null
+++ b/src/mem/slicc/symbols/SymbolTable.py
@@ -0,0 +1,218 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util import code_formatter
+
+from slicc.generate import html
+from slicc.symbols.StateMachine import StateMachine
+from slicc.symbols.Type import Type
+from slicc.util import Location
+
+class SymbolTable(object):
+    def __init__(self):
+        self.sym_vec = []
+        self.sym_map_vec = [ {} ]
+        self.machine_components = {}
+
+        pairs = {}
+        pairs["enumeration"] = "yes"
+        MachineType = Type(self, "MachineType", Location("init", 0), pairs)
+        self.newSymbol(MachineType)
+
+        pairs = {}
+        pairs["primitive"] = "yes"
+        pairs["external"] = "yes"
+        void = Type(self, "void", Location("init", 0), pairs)
+        self.newSymbol(void)
+
+    def __repr__(self):
+        return "[SymbolTable]" # FIXME
+
+    def newSymbol(self, sym):
+        self.registerSym(str(sym), sym)
+        self.sym_vec.append(sym)
+
+    def registerSym(self, id, sym):
+        # Check for redeclaration (in the current frame only)
+        if id in self.sym_map_vec[-1]:
+            sym.error("Symbol '%s' redeclared in same scope.", id)
+
+        # FIXME - warn on masking of a declaration in a previous frame
+        self.sym_map_vec[-1][id] = sym
+
+    def find(self, ident, types=None):
+        for sym_map in reversed(self.sym_map_vec):
+            try:
+                symbol = sym_map[ident]
+            except KeyError:
+                continue
+
+            if types is not None:
+                assert isinstance(symbol, types)
+
+            return symbol
+
+        return None
+
+    def newMachComponentSym(self, symbol):
+        # used to cheat-- that is, access components in other machines
+        machine = self.find("current_machine", StateMachine)
+        if machine:
+            self.machine_components[str(machine)][str(symbol)] = symbol
+
+    def newCurrentMachine(self, sym):
+        self.registerGlobalSym(str(sym), sym)
+        self.registerSym("current_machine", sym)
+        self.sym_vec.append(sym)
+
+        self.machine_components[str(sym)] = {}
+
+    @property
+    def state_machine(self):
+        return self.find("current_machine", StateMachine)
+
+    def pushFrame(self):
+        self.sym_map_vec.append({})
+
+    def popFrame(self):
+        assert len(self.sym_map_vec) > 0
+        self.sym_map_vec.pop()
+
+    def registerGlobalSym(self, ident, symbol):
+        # Check for redeclaration (global frame only)
+        if ident in self.sym_map_vec[0]:
+            symbol.error("Symbol '%s' redeclared in global scope." % ident)
+
+        self.sym_map_vec[0][ident] = symbol
+
+    def getAllType(self, type):
+        for symbol in self.sym_vec:
+            if isinstance(symbol, type):
+                yield symbol
+
+    def writeCodeFiles(self, path):
+        code = code_formatter()
+        code('''
+/** Auto generated C++ code started by $__file__:$__line__ */
+
+#include "mem/ruby/slicc_interface/RubySlicc_includes.hh"
+''')
+        for symbol in self.sym_vec:
+            if isinstance(symbol, Type) and not symbol.isPrimitive:
+                code('#include "mem/protocol/${{symbol.c_ident}}.hh"')
+
+        code.write(path, "Types.hh")
+
+        for symbol in self.sym_vec:
+            symbol.writeCodeFiles(path)
+
+        self.writeControllerFactory(path)
+
+    def writeControllerFactory(self, path):
+        code = code_formatter()
+
+        code('''
+/** \\file ControllerFactory.hh
+ * Auto generatred C++ code started by $__file__:$__line__
+ */
+
+#ifndef CONTROLLERFACTORY_H
+#define CONTROLLERFACTORY_H
+
+#include <string>
+class Network;
+class AbstractController;
+
+class ControllerFactory {
+  public:
+    static AbstractController *createController(const std::string &controller_type, const std::string &name);
+};
+#endif // CONTROLLERFACTORY_H''')
+        code.write(path, "ControllerFactory.hh")
+
+        code = code_formatter()
+        code('''
+/** \\file ControllerFactory.cc
+ * Auto generatred C++ code started by $__file__:$__line__
+ */
+
+#include "mem/protocol/ControllerFactory.hh"
+#include "mem/ruby/slicc_interface/AbstractController.hh"
+#include "mem/protocol/MachineType.hh"
+''')
+
+        controller_types = []
+        for symbol in self.getAllType(StateMachine):
+            code('#include "mem/protocol/${{symbol.ident}}_Controller.hh"')
+            controller_types.append(symbol.ident)
+
+        code('''
+AbstractController *ControllerFactory::createController(const std::string &controller_type, const std::string &name) {
+''')
+
+        for ct in controller_types:
+            code('''
+    if (controller_type == "$ct")
+        return new ${ct}_Controller(name);
+''')
+
+        code('''
+    assert(0); // invalid controller type
+    return NULL;
+}
+''')
+        code.write(path, "ControllerFactory.cc")
+
+    def writeHTMLFiles(self, path):
+        machines = list(self.getAllType(StateMachine))
+        if len(machines) > 1:
+            name = "%s_table.html" % machines[0].ident
+        else:
+            name = "empty.html"
+
+        code = code_formatter()
+        code('''
+<html>
+<head>
+<title>$path</title>
+</head>
+<frameset rows="*,30">
+    <frame name="Table" src="$name">
+    <frame name="Status" src="empty.html">
+</frameset>
+</html>
+''')
+        code.write(path, "index.html")
+
+        code = code_formatter()
+        code("<HTML></HTML>")
+        code.write(path, "empty.html")
+
+        for symbol in self.sym_vec:
+            symbol.writeHTMLFiles(path)
+
+__all__ = [ "SymbolTable" ]
diff --git a/src/mem/slicc/symbols/Transition.cc b/src/mem/slicc/symbols/Transition.cc
deleted file mode 100644
index d6d3481..0000000
--- a/src/mem/slicc/symbols/Transition.cc
+++ /dev/null
@@ -1,173 +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/Transition.hh"
-#include "mem/slicc/symbols/State.hh"
-#include "mem/slicc/symbols/Event.hh"
-#include "mem/slicc/symbols/Action.hh"
-#include "mem/gems_common/util.hh"
-#include "mem/slicc/symbols/Var.hh"
-
-Transition::Transition(string state, string event, string nextState,
-                       const Vector<string>& actionList,
-                       const Location& location,
-                       const Map<string, string>& pairMap)
-  : Symbol(state + "|" + event, location, pairMap)
-{
-  m_state = state;
-  m_event = event;
-  m_nextState = nextState;
-  m_actionList = actionList;
-
-  // Ptrs are undefined at this point
-  m_statePtr = NULL;
-  m_eventPtr = NULL;
-  m_nextStatePtr = NULL;
-  m_actionPtrsValid = false;
-}
-
-void Transition::checkIdents(const Vector<State*>& states,
-                             const Vector<Event*>& events,
-                             const Vector<Action*>& actions)
-{
-  m_statePtr = findIndex(states, m_state);
-  m_eventPtr = findIndex(events, m_event);
-  m_nextStatePtr = findIndex(states, m_nextState);
-
-  for(int i=0; i < m_actionList.size(); i++) {
-    Action* action_ptr = findIndex(actions, m_actionList[i]);
-    int size = action_ptr->getResources().keys().size();
-    for (int j=0; j < size; j++) {
-      Var* var_ptr = action_ptr->getResources().keys()[j];
-      if (var_ptr->getType()->cIdent() != "DNUCAStopTable") {
-        int num = atoi((action_ptr->getResources().lookup(var_ptr)).c_str());
-        if (m_resources.exist(var_ptr)) {
-          num += atoi((m_resources.lookup(var_ptr)).c_str());
-        }
-        m_resources.add(var_ptr, int_to_string(num));
-      } else {
-        m_resources.add(var_ptr, action_ptr->getResources().lookup(var_ptr));
-      }
-    }
-    m_actionPtrs.insertAtBottom(action_ptr);
-  }
-  m_actionPtrsValid = true;
-}
-
-const string& Transition::getStateShorthand() const
-{
-  assert(m_statePtr != NULL);
-  return m_statePtr->getShorthand();
-}
-
-const string& Transition::getEventShorthand() const
-{
-  assert(m_eventPtr != NULL);
-  return m_eventPtr->getShorthand();
-}
-
-const string& Transition::getNextStateShorthand() const
-{
-  assert(m_nextStatePtr != NULL);
-  return m_nextStatePtr->getShorthand();
-}
-
-string Transition::getActionShorthands() const
-{
-  assert(m_actionPtrsValid);
-  string str;
-  int numActions = m_actionPtrs.size();
-  for (int i=0; i<numActions; i++) {
-    str += m_actionPtrs[i]->getShorthand();
-  }
-  return str;
-}
-
-void Transition::print(ostream& out) const
-{
-  out << "[Transition: ";
-  out << "(" << m_state;
-  if (m_statePtr != NULL) {
-    out << ":" << *m_statePtr;
-  }
-  out << ", " << m_event;
-  if (m_eventPtr != NULL) {
-    out << ":" << *m_eventPtr;
-  }
-  out << ") -> ";
-  out << m_nextState;
-  if (m_nextStatePtr != NULL) {
-    out << ":" << *m_nextStatePtr;
-  }
-  out << ", ";
-  out << m_actionList;
-  out << "]";
-}
-
-Event* Transition::findIndex(const Vector<Event*>& vec, string ident)
-{
-  int size = vec.size();
-  for(int i=0; i<size; i++) {
-    if (ident == vec[i]->getIdent()) {
-      return vec[i];
-    }
-  }
-  error("Event not found: " + ident);
-  return NULL;
-}
-
-State* Transition::findIndex(const Vector<State*>& vec, string ident)
-{
-  int size = vec.size();
-  for(int i=0; i<size; i++) {
-    if (ident == vec[i]->getIdent()) {
-      return vec[i];
-    }
-  }
-  error("State not found: " + ident);
-  return NULL;
-}
-
-Action* Transition::findIndex(const Vector<Action*>& vec, string ident)
-{
-  int size = vec.size();
-  for(int i=0; i<size; i++) {
-    if (ident == vec[i]->getIdent()) {
-      return vec[i];
-    }
-  }
-  error("Action not found: " + ident);
-  return NULL;
-}
-
diff --git a/src/mem/slicc/symbols/Transition.hh b/src/mem/slicc/symbols/Transition.hh
deleted file mode 100644
index 75d6da4..0000000
--- a/src/mem/slicc/symbols/Transition.hh
+++ /dev/null
@@ -1,120 +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.
- */
-
-/*
- * Transition.hh
- *
- * Description:
- *
- * $Id$
- *
- * */
-
-#ifndef TRANSITION_H
-#define TRANSITION_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/gems_common/Vector.hh"
-#include "mem/slicc/symbols/Symbol.hh"
-
-class State;
-class Event;
-class Action;
-class Var;
-
-class Transition : public Symbol {
-public:
-  // Constructors
-  Transition(string state, string event, string nextState,
-             const Vector<string>& actionList,
-             const Location& location,
-             const Map<string, string>& pairMap);
-  // Destructor
-  ~Transition() { }
-
-  // Public Methods
-  State* getStatePtr() const { assert(m_statePtr != NULL); return m_statePtr; }
-  Event* getEventPtr() const { assert(m_eventPtr != NULL); return m_eventPtr; }
-  State* getNextStatePtr() const { assert(m_nextStatePtr != NULL); return m_nextStatePtr; }
-
-  //  int getStateIndex() const { assert(m_statePtr != NULL); return m_statePtr->getIndex(); }
-  //  int getEventIndex() const { assert(m_eventPtr != NULL); return m_eventPtr->getIndex(); }
-  //  int getNextStateIndex() const { assert(m_nextStatePtr != NULL); return m_nextStatePtr->getIndex(); }
-  void checkIdents(const Vector<State*>& states,
-                   const Vector<Event*>& events,
-                   const Vector<Action*>& actions);
-
-  const string& getStateShorthand() const;
-  const string& getEventShorthand() const;
-  const string& getNextStateShorthand() const;
-  string getActionShorthands() const;
-  const Vector<Action*>& getActions() const { assert(m_actionPtrsValid); return m_actionPtrs; }
-  const Map<Var*, string>& getResources() const { assert(m_actionPtrsValid); return m_resources; }
-
-  void print(ostream& out) const;
-
-  // Default copy constructor and assignment operator
-  // Transition(const Transition& obj);
-  // Transition& operator=(const Transition& obj);
-private:
-  // Private Methods
-  Event* findIndex(const Vector<Event*>& vec, string ident);
-  State* findIndex(const Vector<State*>& vec, string ident);
-  Action* findIndex(const Vector<Action*>& vec, string ident);
-
-  // Data Members (m_ prefix)
-  string m_state;
-  string m_event;
-  string m_nextState;
-
-  State* m_statePtr;
-  Event* m_eventPtr;
-  State* m_nextStatePtr;
-
-  Vector<string> m_actionList;
-  Vector<Action*> m_actionPtrs;
-  Map<Var*, string> m_resources;
-  bool m_actionPtrsValid;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const Transition& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const Transition& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //TRANSITION_H
diff --git a/src/mem/slicc/symbols/Transition.py b/src/mem/slicc/symbols/Transition.py
new file mode 100644
index 0000000..1bf0904
--- /dev/null
+++ b/src/mem/slicc/symbols/Transition.py
@@ -0,0 +1,61 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.symbols.Symbol import Symbol
+
+class Transition(Symbol):
+    def __init__(self, table, machine, state, event, nextState, actions,
+                 location, pairs):
+        ident = "%s|%s" % (state, event)
+        super(Transition, self).__init__(table, ident, location, pairs)
+
+        self.state = machine.states[state]
+        self.event = machine.events[event]
+        self.nextState = machine.states[nextState]
+        self.actions = [ machine.actions[a] for a in actions ]
+        self.resources = {}
+
+        for action in self.actions:
+            for var,value in action.resources.iteritems():
+                if var.type.ident != "DNUCAStopTable":
+                    num = int(value)
+                    if var in self.resources:
+                        num += int(value)
+                    self.resources[var] = str(num)
+                else:
+                    self.resources[var] = value
+
+    def __repr__(self):
+      return "[Transition: (%r, %r) -> %r, %r]" % \
+             (self.state, self.event, self.nextState, self.actions)
+
+    def getActionShorthands(self):
+        assert self.actions
+
+        return ''.join(a.short for a in self.actions)
+
+__all__ = [ "Transition" ]
diff --git a/src/mem/slicc/symbols/Type.cc b/src/mem/slicc/symbols/Type.cc
deleted file mode 100644
index 5afe534..0000000
--- a/src/mem/slicc/symbols/Type.cc
+++ /dev/null
@@ -1,779 +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.
- */
-
-/*
- * Type.cc
- *
- * Description: See Type.hh
- *
- * $Id$
- * */
-
-#include "mem/slicc/symbols/Type.hh"
-#include "mem/slicc/generator/fileio.hh"
-#include "mem/gems_common/Map.hh"
-#include "mem/slicc/symbols/StateMachine.hh"
-
-Type::Type(string id, const Location& location,
-           const Map<string, string>& pairs,
-           StateMachine* machine_ptr)
-  : Symbol(id, location, pairs)
-{
-  if (machine_ptr == NULL) {
-    m_c_id = id;
-  } else if (isExternal() || isPrimitive()) {
-    if (existPair("external_name")) {
-      m_c_id = lookupPair("external_name");
-    } else {
-      m_c_id = id;
-    }
-  } else {
-    m_c_id = machine_ptr->toString() + "_" + id;  // Append with machine name
-  }
-
-  if(existPair("desc")){
-    m_desc = lookupPair("desc");
-  } else {
-    m_desc = "No description avaliable";
-  }
-
-  // check for interface that this Type implements
-  if(existPair("interface")) {
-    string interface = lookupPair("interface");
-    if(interface == "Message" || interface == "NetworkMessage") {
-      addPair("message", "yes");
-    }
-    if(interface == "NetworkMessage") {
-      addPair("networkmessage", "yes");
-    }
-  }
-
-  // FIXME - all of the following id comparisons are fragile hacks
-  if ((getIdent() == "CacheMemory") || (getIdent() == "NewCacheMemory") ||
-      (getIdent() == "TLCCacheMemory") || (getIdent() == "DNUCACacheMemory") ||
-      (getIdent() == "DNUCABankCacheMemory") || (getIdent() == "L2BankCacheMemory") ||
-      (getIdent() == "CompressedCacheMemory") || (getIdent() == "PrefetchCacheMemory")) {
-    addPair("cache", "yes");
-  }
-
-  if ((getIdent() == "TBETable") || (getIdent() == "DNUCATBETable") || (getIdent() == "DNUCAStopTable")) {
-    addPair("tbe", "yes");
-  }
-
-  if ((getIdent() == "NewTBETable")) {
-    addPair("newtbe", "yes");
-  }
-
-  if ((getIdent() == "TimerTable")) {
-    addPair("timer", "yes");
-  }
-
-  if ((getIdent() == "DirectoryMemory")) {
-    addPair("dir", "yes");
-  }
-
-  if ((getIdent() == "PersistentTable")) {
-    addPair("persistent", "yes");
-  }
-
-  if ((getIdent() == "Prefetcher")) {
-    addPair("prefetcher", "yes");
-  }
-
-  if ((getIdent() == "DNUCA_Movement")) {
-    addPair("mover", "yes");
-  }
-
-  if (id == "MachineType") {
-    m_isMachineType = true;
-  } else {
-    m_isMachineType = false;
-  }
-}
-
-// Return false on error
-bool Type::dataMemberAdd(string id, Type* type_ptr, Map<string, string>& pairs,
-                         string* init_code)
-{
-  if (dataMemberExist(id)) {
-    return false; // Error
-  } else {
-    m_data_member_map.add(id, type_ptr);
-    m_data_member_ident_vec.insertAtBottom(id);
-    m_data_member_type_vec.insertAtBottom(type_ptr);
-    m_data_member_pairs_vec.insertAtBottom(pairs);
-    m_data_member_init_code_vec.insertAtBottom(init_code);
-  }
-
-  return true;
-}
-
-string Type::methodId(string name,
-                      const Vector<Type*>& param_type_vec)
-{
-  string paramStr = "";
-  for (int i = 0; i < param_type_vec.size(); i++) {
-    paramStr += "_"+param_type_vec[i]->cIdent();
-  }
-  return name+paramStr;
-}
-
-bool Type::methodAdd(string name,
-                     Type* return_type_ptr,
-                     const Vector<Type*>& param_type_vec)
-{
-  string id = methodId(name, param_type_vec);
-  if (methodExist(id)) {
-    return false; // Error
-  } else {
-    m_method_return_type_map.add(id, return_type_ptr);
-    m_method_param_type_map.add(id, param_type_vec);
-    return true;
-  }
-}
-
-bool Type::enumAdd(string id, Map<string, string> pairs_map)
-{
-  if (enumExist(id)) {
-    return false;
-  } else {
-    m_enum_map.add(id, true);
-    m_enum_vec.insertAtBottom(id);
-    m_enum_pairs.insertAtBottom(pairs_map);
-
-    // Add default
-    if (!existPair("default")) {
-      addPair("default", cIdent()+"_NUM");
-    }
-
-    return true;
-  }
-}
-
-void Type::writeCFiles(string path)
-{
-  if (isExternal()) {
-    // Do nothing
-  } else if (isEnumeration()) {
-    printEnumH(path);
-    printEnumC(path);
-  } else { // User defined structs and messages
-    printTypeH(path);
-    printTypeC(path);
-  }
-}
-
-void Type::printTypeH(string path) const
-{
-  ostringstream out;
-  int size = m_data_member_type_vec.size();
-  string type_name = cIdent();  // Identifier for the type in C
-
-  // Header
-  out << "/** \\file " << type_name << ".hh" << endl;
-  out << "  * " << endl;
-  out << "  * Auto generated C++ code started by "<<__FILE__<<":"<<__LINE__<< endl;
-  out << "  */" << endl;
-  out << endl;
-  out << "#ifndef " << type_name << "_H" << endl;
-  out << "#define " << type_name << "_H" << endl;
-  out << endl;
-
-  // Include all of the #includes needed
-  out << "#include \"mem/ruby/common/Global.hh\"" << endl;
-  out << "#include \"mem/gems_common/Allocator.hh\"" << endl;
-  for (int i=0; i < size; i++) {
-    Type* type = m_data_member_type_vec[i];
-    if (!type->isPrimitive()) {
-      out << "#include \"mem/protocol/" << type->cIdent() << ".hh" << "\"" << endl;
-    }
-  }
-  string interface = "";
-  if(existPair("interface")) {
-    interface = lookupPair("interface");
-    out << "#include \"mem/protocol/" << interface << ".hh\"" << endl;
-  }
-
-  // Class definition
-  out << "class " << type_name;
-
-  if(interface != "") {
-    out << " :  public " << interface ;
-  }
-
-  out << " {" << endl;
-  out << "public:" << endl;
-
-  // ******** Default constructor ********
-
-  out << "  " << type_name << "() " << endl;
-
-  // Call superclass constructor
-  if (interface != "") {
-      out << "  : " << interface << "()" << endl;
-  }
-
-  out << "  {" << endl;
-
-  if(!isGlobal()) {
-    for (int i=0; i < size; i++) {
-
-      Type* type_ptr = m_data_member_type_vec[i];
-      string id = m_data_member_ident_vec[i];
-      if (m_data_member_pairs_vec[i].exist("default")) {
-        // look for default value
-        string default_value = m_data_member_pairs_vec[i].lookup("default");
-        out << "    m_" << id << " = " << default_value << "; // default for this field " << endl;
-      } else if (type_ptr->hasDefault()) {
-        // Look for the type default
-        string default_value = type_ptr->getDefault();
-        out << "    m_" << id << " = " << default_value << "; // default value of " << type_ptr->cIdent() << endl;
-      } else {
-        out << "    // m_" << id << " has no default" << endl;
-      }
-    }
-  } // end of if(!isGlobal())
-  out << "  }" << endl;
-
-  // ******** Default destructor ********
-  out << "  ";
-  out << "~" << type_name << "() { };" << endl;
-
-  // ******** Full init constructor ********
-  if(! isGlobal()) {
-    out << "  " << type_name << "(";
-
-    for (int i=0; i < size; i++) {
-      if (i != 0) {
-        out << ", ";
-      }
-      Type* type = m_data_member_type_vec[i];
-      string id = m_data_member_ident_vec[i];
-      out << "const " << type->cIdent() << "& local_" << id;
-    }
-
-    if (isMessage()) {
-      out << ", const unsigned local_proc_id" << flush;
-    }
-
-    out << ")" << endl;
-
-    // Call superclass constructor
-    if (interface != "") {
-      out << "  : " << interface << "()" << endl;
-    }
-
-    out << "  {" << endl;
-    for (int i=0; i < size; i++) {
-      Type* type_ptr = m_data_member_type_vec[i];
-      string id = m_data_member_ident_vec[i];
-      out << "    m_" << id << " = local_" << id << ";" << endl;
-      if (m_data_member_pairs_vec[i].exist("nextLineCallHack")) {
-        string next_line_value = m_data_member_pairs_vec[i].lookup("nextLineCallHack");
-        out << "    m_" << id << next_line_value << ";" << endl;
-      }
-    }
-    if (isMessage()) {
-      out << "    proc_id = local_proc_id;" << endl << flush;
-    }
-    out << "  }" << endl;
-  } // end of if(!isGlobal())
-
-  // create a static factory method
-  if (interface != "") {
-    out << "  static " << interface << "* create() {" << endl;
-    out << "    return new " << type_name << "(); " << endl;
-    out << "  }" << endl;
-  }
-
-  // bobba -
-  //******** Partial init constructor ********
-  //**  Constructor needs only the first n-1 data members for init
-  //** HACK to create objects with partially specified data members
-  //** Need to get rid of this and use hierarchy instead
-//   if(! isGlobal()) {
-//     out << "  " << type_name << "(";
-
-//     for (int i=0; i < size-1; i++) {
-//       if (i != 0) {
-//         out << ", ";
-//       }
-//       Type* type = m_data_member_type_vec[i];
-//       string id = m_data_member_ident_vec[i];
-//       out << "const " << type->cIdent() << "& local_" << id;
-//     }
-//     out << ")" << endl;
-
-//     // Call superclass constructor
-//     if (interface != "") {
-//       out << "  : " << interface << "()" << endl;
-//     }
-
-//     out << "  {" << endl;
-//     for (int i=0; i < size-1; i++) {
-//       Type* type_ptr = m_data_member_type_vec[i];
-//       string id = m_data_member_ident_vec[i];
-//       out << "    m_" << id << " = local_" << id << ";" << endl;
-//       if (m_data_member_pairs_vec[i].exist("nextLineCallHack")) {
-//         string next_line_value = m_data_member_pairs_vec[i].lookup("nextLineCallHack");
-//         out << "    m_" << id << next_line_value << ";" << endl;
-//       }
-
-//     }
-//     out << "  }" << endl;
-//   } // end of if(!isGlobal())
-
-  // ******** Message member functions ********
-  // FIXME: those should be moved into slicc file, slicc should support more of
-  // the c++ class inheritance
-
-  if (isMessage()) {
-    out << "  Message* clone() const { checkAllocator(); return s_allocator_ptr->allocate(*this); }" << endl;
-    out << "  void destroy() { checkAllocator(); s_allocator_ptr->deallocate(this); }" << endl;
-    out << "  static Allocator<" << type_name << ">* s_allocator_ptr;" << endl;
-    out << "  static void checkAllocator() { if (s_allocator_ptr == NULL) { s_allocator_ptr = new Allocator<" << type_name << ">; }}" << endl;
-  }
-
-  if(!isGlobal()) {
-    // const Get methods for each field
-    out << "  // Const accessors methods for each field" << endl;
-    for (int i=0; i < size; i++) {
-      Type* type_ptr = m_data_member_type_vec[i];
-      string type = type_ptr->cIdent();
-      string id = m_data_member_ident_vec[i];
-      out << "/** \\brief Const accessor method for " << id << " field." << endl;
-      out << "  * \\return " << id << " field" << endl;
-      out << "  */" << endl;
-      out << "  const " << type << "& get" << id
-          << "() const { return m_" << id << "; }" << endl;
-    }
-
-    out << endl;
-
-    // Non-const Get methods for each field
-    out << "  // Non const Accessors methods for each field" << endl;
-    for (int i=0; i < size; i++) {
-      Type* type_ptr = m_data_member_type_vec[i];
-      string type = type_ptr->cIdent();
-      string id = m_data_member_ident_vec[i];
-      out << "/** \\brief Non-const accessor method for " << id << " field." << endl;
-      out << "  * \\return " << id << " field" << endl;
-      out << "  */" << endl;
-      out << "  " << type << "& get" << id
-          << "() { return m_" << id << "; }" << endl;
-    }
-
-    out << endl;
-
-    // Set methods for each field
-    out << "  // Mutator methods for each field" << endl;
-    for (int i=0; i < size; i++) {
-      Type* type_ptr = m_data_member_type_vec[i];
-      string type = type_ptr->cIdent();
-      string id = m_data_member_ident_vec[i];
-      out << "/** \\brief Mutator method for " << id << " field */" << endl;
-      out << "  void set" << id << "(const " << type << "& local_"
-          << id << ") { m_" << id << " = local_" << id << "; }" << endl;
-    }
-
-    out << endl;
-  } // end of if(!isGlobal())
-
-  out << "  void print(ostream& out) const;" << endl;
-  out << "//private:" << endl;
-
-  // Data members for each field
-  for (int i=0; i < size; i++) {
-    if (!m_data_member_pairs_vec[i].exist("abstract")) {
-      out << "  ";
-      // global structure
-      if(isGlobal()) out << "static const ";
-
-      Type* type = m_data_member_type_vec[i];
-      string id = m_data_member_ident_vec[i];
-      out << type->cIdent() << " m_" << id;
-
-      // init value
-      string* init_code = m_data_member_init_code_vec[i];
-      if(init_code) {
-        // only global structure can have init value here
-        assert(isGlobal());
-        out << " = " << *init_code << " ";
-      }
-      out << ";";
-      if (m_data_member_pairs_vec[i].exist("desc")) {
-        string desc = m_data_member_pairs_vec[i].lookup("desc");
-        out << " /**< " << desc << "*/";
-      }
-      out << endl;
-    }
-  }
-
-  if (isMessage()) {
-    out << "  unsigned proc_id;" << endl << flush;
-  }
-
-  out << "};" << endl;  // End class
-
-  out << "// Output operator declaration" << endl;
-  out << "ostream& operator<<(ostream& out, const " << type_name << "& obj);" << endl;
-  out << endl;
-  out << "// Output operator definition" << endl;
-  out << "extern inline" << endl;
-  out << "ostream& operator<<(ostream& out, const " << type_name << "& obj)" << endl;
-  out << "{" << endl;
-  out << "  obj.print(out);" << endl;
-  out << "  out << flush;" << endl;
-  out << "  return out;" << endl;
-  out << "}" << endl;
-  out << endl;
-  out << "#endif // " << type_name << "_H" << endl;
-
-  // Write it out
-  conditionally_write_file(path + type_name + ".hh", out);
-}
-
-void Type::printTypeC(string path) const
-{
-  ostringstream out;
-  int size = m_data_member_type_vec.size();
-  string type_name = cIdent();  // Identifier for the type in C
-
-  // Header
-  out << "/** \\file " << type_name << ".cc" << endl;
-  out << "  * " << endl;
-  out << "  * Auto generated C++ code started by "<<__FILE__<<":"<<__LINE__<< endl;
-  out << "  */" << endl;
-  out << endl;
-  out << "#include \"mem/protocol/" << type_name << ".hh\"" << endl;
-  out << endl;
-  if (isMessage()) {
-    out << "Allocator<" << type_name << ">* " << type_name << "::s_allocator_ptr = NULL;" << endl;
-  }
-  out << "/** \\brief Print the state of this object */" << endl;
-  out << "void " << type_name << "::print(ostream& out) const" << endl;
-  out << "{" << endl;
-  out << "  out << \"[" << type_name << ": \";" << endl;
-
-  // For each field
-  for (int i=0; i < size; i++) {
-    string id = m_data_member_ident_vec[i];
-    out << "  out << \"" << id << "=\" << m_" << id << " << \" \";" << endl;
-  }
-
-  if (isMessage()) {
-    out << "  out << \"" << "Time" << "=\" << getTime()" <<  " << \" \";" << endl;
-  }
-
-  // Trailer
-  out << "  out << \"]\";" << endl;
-  out << "}" << endl;
-
-  // Write it out
-  conditionally_write_file(path + type_name + ".cc", out);
-}
-
-void Type::printEnumH(string path) const
-{
-  ostringstream out;
-  int size = m_enum_vec.size();
-  string type_name = cIdent();  // Identifier for the type in C
-  string type_desc = desc();
-
-  // Header
-  out << "/** \\file " << type_name << ".hh" << endl;
-  out << "  * " << endl;
-  out << "  * Auto generated C++ code started by "<<__FILE__<<":"<<__LINE__<< endl;
-  out << "  */" << endl;
-
-  out << "#ifndef " << type_name << "_H" << endl;
-  out << "#define " << type_name << "_H" << endl;
-  out << endl;
-  // Include all of the #includes needed
-  out << "#include \"mem/ruby/common/Global.hh\"" << endl;
-  out << endl;
-
-  // Class definition
-  out << "/** \\enum " << type_name << endl;
-  out << "  * \\brief " << type_desc << endl;
-  out << "  */" << endl;
-  out << "enum " << type_name << " {" << endl;
-
-  out << "  " << type_name << "_FIRST," << endl;
-
-  // For each field
-  for(int i = 0; i < size; i++ ) {
-    string id = m_enum_vec[i];
-    string description;
-    if(m_enum_pairs[i].exist("desc")){
-      description = m_enum_pairs[i].lookup("desc");
-    } else {
-      description = "No description avaliable";
-    }
-    if (i == 0) {
-      out << "  " << type_name << "_" << id << " = " << type_name << "_FIRST,  /**< " << description << " */" << endl;
-    }
-    else {
-      out << "  " << type_name << "_" << id << ",  /**< " << description << " */" << endl;
-    }
-  }
-  out << "  " << type_name << "_NUM" << endl;
-  out << "};" << endl;
-
-  // Code to convert from a string to the enumeration
-  out << type_name << " string_to_" << type_name << "(const string& str);" << endl;
-
-  // Code to convert state to a string
-  out << "string " << type_name << "_to_string(const " << type_name << "& obj);" << endl;
-
-  // Code to increment an enumeration type
-  out << type_name << " &operator++( " << type_name << " &e);" << endl;
-
-  // MachineType hack used to set the base component id for each Machine
-  if (m_isMachineType) {
-    out << "int " << type_name << "_base_level(const " << type_name << "& obj);" << endl;
-    out << "MachineType " << type_name << "_from_base_level(int);" << endl;
-    out << "int " << type_name << "_base_number(const " << type_name << "& obj);" << endl;
-    out << "int " << type_name << "_base_count(const " << type_name << "& obj);" << endl;
-    //    out << "int " << type_name << "_chip_count(const " << type_name << "& obj, int chipID);" << endl;
-
-    for(int i = 0; i < size; i++ ) {
-      string id = m_enum_vec[i];
-      out << "#define MACHINETYPE_" << id << " 1" << endl;
-    }
-    cout << endl;
-  }
-
-  // Trailer
-  out << "ostream& operator<<(ostream& out, const " << type_name << "& obj);" << endl;
-  out << endl;
-  out << "#endif // " << type_name << "_H" << endl;
-
-  // Write the file
-  conditionally_write_file(path + type_name + ".hh", out);
-}
-
-void Type::printEnumC(string path) const
-{
-  ostringstream out;
-  int size = m_enum_vec.size();
-  string type_name = cIdent();  // Identifier for the type in C
-
-  // Header
-  out << "/** \\file " << type_name << ".hh" << endl;
-  out << "  * " << endl;
-  out << "  * Auto generated C++ code started by "<<__FILE__<<":"<<__LINE__<< endl;
-  out << "  */" << endl;
-
-  out << endl;
-  out << "#include \"mem/protocol/" << type_name << ".hh\"" << endl;
-  if (m_isMachineType) {
-    out << "#include \"mem/protocol/ControllerFactory.hh\"" << endl;
-    for( int i = 0; i<size; i++ ) {
-      out << "#include \"mem/protocol/" << m_enum_vec[i] << "_Controller.hh\"" << endl;
-    }
-    out << endl;
-  }
-  out << endl;
-
-  // Code for output operator
-  out << "ostream& operator<<(ostream& out, const " << type_name << "& obj)" << endl;
-  out << "{" << endl;
-  out << "  out << " << type_name << "_to_string(obj);" << endl;
-  out << "  out << flush;" << endl;
-  out << "  return out;" << endl;
-  out << "}" << endl;
-
-  // Code to convert state to a string
-  out << endl;
-  out << "string " << type_name << "_to_string(const " << type_name << "& obj)" << endl;
-  out << "{" << endl;
-  out << "  switch(obj) {" << endl;
-
-  // For each field
-  for( int i = 0; i<size; i++ ) {
-    out << "  case " << type_name << "_" << m_enum_vec[i] << ":" << endl;
-    out << "    return \"" << m_enum_vec[i] << "\";" << endl;
-  }
-
-  // Trailer
-  out << "  default:" << endl;
-  out << "    ERROR_MSG(\"Invalid range for type " << type_name << "\");" << endl;
-  out << "    return \"\";" << endl;
-  out << "  }" << endl;
-  out << "}" << endl;
-
-  // Code to convert from a string to the enumeration
-  out << endl;
-  out << type_name << " string_to_" << type_name << "(const string& str)" << endl;
-  out << "{" << endl;
-  out << "  if (false) {" << endl;
-
-  // For each field
-  for( int i = 0; i<size; i++ ) {
-    out << "  } else if (str == \"" << m_enum_vec[i] << "\") {" << endl;
-    out << "    return " << type_name << "_" << m_enum_vec[i] << ";" << endl;
-  }
-
-  out << "  } else {" << endl;
-  out << "    WARN_EXPR(str);" << endl;
-  out << "    ERROR_MSG(\"Invalid string conversion for type " << type_name << "\");" << endl;
-  out << "  }" << endl;
-  out << "}" << endl;
-
-  // Code to increment an enumeration type
-  out << endl;
-  out << type_name << "& operator++( " << type_name << "& e) {" << endl;
-  out << "  assert(e < " << type_name << "_NUM);" << endl;
-  out << "  return e = " << type_name << "(e+1);" << endl;
-  out << "}" << endl;
-
-  // MachineType hack used to set the base level and number of components for each Machine
-  if (m_isMachineType) {
-    out << endl;
-    out << "/** \\brief returns the base vector index for each machine type to be used by NetDest " << endl;
-    out << "  * " << endl;
-    out << "  * \\return the base vector index for each machine type to be used by NetDest" << endl;
-    out << "  * \\see NetDest.hh" << endl;
-    out << "  */" << endl;
-    out << "int " << type_name << "_base_level(const " << type_name << "& obj)" << endl;
-    out << "{" << endl;
-    out << "  switch(obj) {" << endl;
-
-    // For each field
-    Vector < string > MachineNames;
-    for( int i = 0; i<size; i++ ) {
-      out << "  case " << type_name << "_" << m_enum_vec[i] << ":" << endl;
-      out << "    return " << MachineNames.size() << ";" << endl;
-      MachineNames.insertAtBottom(m_enum_vec[i]);
-    }
-
-    // total num
-    out << "  case " << type_name << "_NUM:" << endl;
-    out << "    return " << MachineNames.size() << ";" << endl;
-
-    // Trailer
-    out << "  default:" << endl;
-    out << "    ERROR_MSG(\"Invalid range for type " << type_name << "\");" << endl;
-    out << "    return -1;" << endl;
-    out << "  }" << endl;
-    out << "}" << endl;
-
-    out << "/** \\brief returns the machine type for each base vector index used by NetDest" << endl;
-    out << "  * " << endl;
-    out << "  * \\return the MachineTYpe" << endl;
-    out << "  */" << endl;
-    out << "MachineType " << type_name << "_from_base_level(int type)" << endl;
-    out << "{" << endl;
-    out << "  switch(type) {" << endl;
-
-    // For each field
-    MachineNames.clear();
-    for( int i = 0; i<size; i++ ) {
-      out << "  case " << MachineNames.size() << ":" << endl;
-      out << "    return " << type_name << "_" << m_enum_vec[i] << ";" << endl;
-      MachineNames.insertAtBottom(m_enum_vec[i]);
-    }
-
-    // Trailer
-    out << "  default:" << endl;
-    out << "    ERROR_MSG(\"Invalid range for type " << type_name << "\");" << endl;
-    out << "    return MachineType_NUM;" << endl;
-    out << "  }" << endl;
-    out << "}" << endl;
-
-
-    out << endl;
-    out << "/** \\brief The return value indicates the number of components created" << endl;
-    out << "  * before a particular machine's components" << endl;
-    out << "  * " << endl;
-    out << "  * \\return the base number of components for each machine" << endl;
-    out << "  */" << endl;
-    out << "int " << type_name << "_base_number(const " << type_name << "& obj)" << endl;
-    out << "{" << endl;
-    out << "  switch(obj) {" << endl;
-
-    // For each field
-    MachineNames.clear();
-    for( int i = 0; i<size; i++ ) {
-      out << "  case " << type_name << "_" << m_enum_vec[i] << ":" << endl;
-      out << "    return 0";
-      for ( int m = 0; m<MachineNames.size(); m++) {
-        out << "+ " << MachineNames[m] << "_Controller::getNumControllers()";
-      }
-      out << ";" << endl;
-      MachineNames.insertAtBottom(m_enum_vec[i]);
-    }
-
-    // total num
-    out << "  case " << type_name << "_NUM:" << endl;
-    out << "    return 0";
-    for ( int m = 0; m<MachineNames.size(); m++) {
-      out << "+ " << MachineNames[m] << "_Controller::getNumControllers()";
-    }
-    out << ";" << endl;
-
-    // Trailer
-    out << "  default:" << endl;
-    out << "    ERROR_MSG(\"Invalid range for type " << type_name << "\");" << endl;
-    out << "    return -1;" << endl;
-    out << "  }" << endl;
-    out << "}" << endl;
-
-
-    out << endl;
-    out << "/** \\brief returns the total number of components for each machine" << endl;
-    out << "  * \\return the total number of components for each machine" << endl;
-    out << "  */" << endl;
-    out << "int " << type_name << "_base_count(const " << type_name << "& obj)" << endl;
-    out << "{" << endl;
-    out << "  switch(obj) {" << endl;
-
-    // For each field
-    for( int i = 0; i<size; i++ ) {
-      out << "  case " << type_name << "_" << m_enum_vec[i] << ":" << endl;
-      out << "    return " << m_enum_vec[i] << "_Controller::getNumControllers();" << endl;
-    }
-
-    // total num
-    out << "  case " << type_name << "_NUM:" << endl;
-    // Trailer
-    out << "  default:" << endl;
-    out << "    ERROR_MSG(\"Invalid range for type " << type_name << "\");" << endl;
-    out << "    return -1;" << endl;
-    out << "  }" << endl;
-    out << "}" << endl;
-
-    out << endl;
-
-  }
-
-  // Write the file
-  conditionally_write_file(path + type_name + ".cc", out);
-}
diff --git a/src/mem/slicc/symbols/Type.hh b/src/mem/slicc/symbols/Type.hh
deleted file mode 100644
index 07d661d..0000000
--- a/src/mem/slicc/symbols/Type.hh
+++ /dev/null
@@ -1,155 +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.
- */
-
-/*
- * Type.hh
- *
- * Description:
- *
- * $Id$
- *
- * */
-
-#ifndef TYPE_H
-#define TYPE_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/gems_common/Map.hh"
-#include "mem/slicc/symbols/Symbol.hh"
-
-class StateMachine;
-
-class Type : public Symbol {
-public:
-  // Constructors
-  Type(string id, const Location& location,
-       const Map<string, string>& pairs,
-       StateMachine* machine_ptr = NULL);
-
-  // Destructor
-  ~Type() {}
-
-  // Public Methods
-  string cIdent() const { return m_c_id; }
-  string desc() const { return m_desc; }
-
-  bool isPrimitive() const { return existPair("primitive"); }
-  bool isNetworkMessage() const { return existPair("networkmessage"); }
-  bool isMessage() const { return existPair("message"); }
-  bool isBuffer() const { return existPair("buffer"); }
-  bool isInPort() const { return existPair("inport"); }
-  bool isOutPort() const { return existPair("outport"); }
-  bool isEnumeration() const { return existPair("enumeration"); }
-  bool isExternal() const { return existPair("external"); }
-  bool isGlobal() const { return existPair("global"); }
-  bool isInterface() const { return existPair("interface"); }
-
-  // The data members of this type - only valid for messages and SLICC
-  // declared structures
-  // Return false on error
-  bool dataMemberAdd(string id, Type* type_ptr, Map<string, string>& pairs,
-                     string* init_code);
-  bool dataMemberExist(string id) const { return m_data_member_map.exist(id); }
-  Type* dataMemberType(string id) const { return m_data_member_map.lookup(id); }
-
-  // The methods of this type - only valid for external types
-  // Return false on error
-  bool methodAdd(string name, Type* return_type_ptr, const Vector<Type*>& param_type_vec);
-  bool methodExist(string id) const { return m_method_return_type_map.exist(id); }
-
-  string methodId(string name, const Vector<Type*>& param_type_vec);
-  Type* methodReturnType(string id) const { return m_method_return_type_map.lookup(id); }
-  const Vector<Type*>& methodParamType(string id) const { return m_method_param_type_map.lookup(id); }
-
-  // The enumeration idents of this type - only valid for enums
-  // Return false on error
-  bool enumAdd(string id, Map<string, string> pairs);
-  bool enumExist(string id) const { return m_enum_map.exist(id); }
-
-  // Write the C output files
-  void writeCFiles(string path) ;
-
-  bool hasDefault() const { return existPair("default"); }
-  string getDefault() const { return lookupPair("default"); }
-
-  void print(ostream& out) const {}
-private:
-  // Private Methods
-
-  void printTypeH(string path) const;
-  void printTypeC(string path) const;
-  void printEnumC(string path) const;
-  void printEnumH(string path) const;
-
-  // Private copy constructor and assignment operator
-  Type(const Type& obj);
-  Type& operator=(const Type& obj);
-
-  // Data Members (m_ prefix)
-  string m_c_id;
-  string m_desc;
-
-  // Data Members
-  Map<string, Type*> m_data_member_map;
-  Vector<string> m_data_member_ident_vec;
-  Vector<Type*> m_data_member_type_vec;
-  Vector<Map<string, string> > m_data_member_pairs_vec;
-  Vector<string*> m_data_member_init_code_vec;
-  // Needs pairs here
-
-  // Methods
-  Map<string, Type*> m_method_return_type_map;
-  Map<string, Vector<Type*> > m_method_param_type_map;
-  // Needs pairs here
-
-  // Enum
-  Map<string, bool> m_enum_map;
-  Vector<string> m_enum_vec;
-  Vector< Map < string, string > > m_enum_pairs;
-
-  // MachineType Hack
-  bool m_isMachineType;
-
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const Type& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const Type& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //TYPE_H
diff --git a/src/mem/slicc/symbols/Type.py b/src/mem/slicc/symbols/Type.py
new file mode 100644
index 0000000..2541296
--- /dev/null
+++ b/src/mem/slicc/symbols/Type.py
@@ -0,0 +1,650 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from m5.util import code_formatter, orderdict
+
+from slicc.util import PairContainer
+from slicc.symbols.Symbol import Symbol
+
+class DataMember(PairContainer):
+    def __init__(self, ident, type, pairs, init_code):
+        super(DataMember, self).__init__(pairs)
+        self.ident = ident
+        self.type = type
+        self.init_code = init_code
+
+class Enumeration(PairContainer):
+    def __init__(self, ident, pairs):
+        super(Enumeration, self).__init__(pairs)
+        self.ident = ident
+
+class Method(object):
+    def __init__(self, return_type, param_types):
+        self.return_type = return_type
+        self.param_types = param_types
+
+class Type(Symbol):
+    def __init__(self, table, ident, location, pairs, machine=None):
+        super(Type, self).__init__(table, ident, location, pairs)
+        self.c_ident = ident
+        if machine:
+            if self.isExternal or self.isPrimitive:
+                if "external_name" in self:
+                    self.c_ident = self["external_name"]
+            else:
+                # Append with machine name
+                self.c_ident = "%s_%s" % (machine, ident)
+
+        self.pairs.setdefault("desc", "No description avaliable")
+
+        # check for interface that this Type implements
+        if "interface" in self:
+            interface = self["interface"]
+            if interface in ("Message", "NetworkMessage"):
+                self["message"] = "yes"
+            if interface == "NetworkMessage":
+                self["networkmessage"] = "yes"
+
+        # FIXME - all of the following id comparisons are fragile hacks
+        if self.ident in ("CacheMemory", "NewCacheMemory",
+                          "TLCCacheMemory", "DNUCACacheMemory",
+                          "DNUCABankCacheMemory", "L2BankCacheMemory",
+                          "CompressedCacheMemory", "PrefetchCacheMemory"):
+            self["cache"] = "yes"
+
+        if self.ident in ("TBETable", "DNUCATBETable", "DNUCAStopTable"):
+            self["tbe"] = "yes"
+
+        if self.ident == "NewTBETable":
+            self["newtbe"] = "yes"
+
+        if self.ident == "TimerTable":
+            self["timer"] = "yes"
+
+        if self.ident == "DirectoryMemory":
+            self["dir"] = "yes"
+
+        if self.ident == "PersistentTable":
+            self["persistent"] = "yes"
+
+        if self.ident == "Prefetcher":
+            self["prefetcher"] = "yes"
+
+        if self.ident == "DNUCA_Movement":
+            self["mover"] = "yes"
+
+        self.isMachineType = (ident == "MachineType")
+
+        self.data_members = orderdict()
+
+        # Methods
+        self.methods = {}
+
+        # Enums
+        self.enums = orderdict()
+
+    @property
+    def isPrimitive(self):
+        return "primitive" in self
+    @property
+    def isNetworkMessage(self):
+        return "networkmessage" in self
+    @property
+    def isMessage(self):
+        return "message" in self
+    @property
+    def isBuffer(self):
+        return "buffer" in self
+    @property
+    def isInPort(self):
+        return "inport" in self
+    @property
+    def isOutPort(self):
+        return "outport" in self
+    @property
+    def isEnumeration(self):
+        return "enumeration" in self
+    @property
+    def isExternal(self):
+        return "external" in self
+    @property
+    def isGlobal(self):
+        return "global" in self
+    @property
+    def isInterface(self):
+        return "interface" in self
+
+    # Return false on error
+    def dataMemberAdd(self, ident, type, pairs, init_code):
+        if ident in self.data_members:
+            return False
+
+        member = DataMember(ident, type, pairs, init_code)
+        self.data_members[ident] = member
+
+        return True
+
+    def dataMemberType(self, ident):
+        return self.data_members[ident].type
+
+    def methodId(self, name, param_type_vec):
+        return '_'.join([name] + [ pt.c_ident for pt in param_type_vec ])
+
+    def methodAdd(self, name, return_type, param_type_vec):
+        ident = self.methodId(name, param_type_vec)
+        if ident in self.methods:
+            return False
+
+        self.methods[ident] = Method(return_type, param_type_vec)
+        return True
+
+    def enumAdd(self, ident, pairs):
+        if ident in self.enums:
+            return False
+
+        self.enums[ident] = Enumeration(ident, pairs)
+
+        # Add default
+        if "default" not in self:
+            self["default"] = "%s_NUM" % self.c_ident
+
+        return True
+
+    def writeCodeFiles(self, path):
+        if self.isExternal:
+            # Do nothing
+            pass
+        elif self.isEnumeration:
+            self.printEnumHH(path)
+            self.printEnumCC(path)
+        else:
+            # User defined structs and messages
+            self.printTypeHH(path)
+            self.printTypeCC(path)
+
+    def printTypeHH(self, path):
+        code = code_formatter()
+        code('''
+/** \\file ${{self.c_ident}}.hh
+ *
+ *
+ * Auto generated C++ code started by $__file__:$__line__
+ */
+
+#ifndef ${{self.c_ident}}_H
+#define ${{self.c_ident}}_H
+
+#include "mem/ruby/common/Global.hh"
+#include "mem/gems_common/Allocator.hh"
+''')
+
+        for dm in self.data_members.values():
+            if not dm.type.isPrimitive:
+                code('#include "mem/protocol/$0.hh"', dm.type.c_ident)
+
+        parent = ""
+        if "interface" in self:
+            code('#include "mem/protocol/$0.hh"', self["interface"])
+            parent = " :  public %s" % self["interface"]
+
+        code('''
+$klass ${{self.c_ident}}$parent {
+  public:
+    ${{self.c_ident}}()
+''', klass="class")
+
+        # Call superclass constructor
+        if "interface" in self:
+            code('        : ${{self["interface"]}}()')
+
+        code.indent()
+        code("{")
+        if not self.isGlobal:
+            code.indent()
+            for dm in self.data_members.values():
+                ident = dm.ident
+                if "default" in dm:
+                    # look for default value
+                    code('m_$ident = ${{dm["default"]}}; // default for this field')
+                elif "default" in dm.type:
+                    # Look for the type default
+                    tid = dm.type.c_ident
+                    code('m_$ident = ${{dm.type["default"]}}; // default value of $tid')
+                else:
+                    code('// m_$ident has no default')
+            code.dedent()
+        code('}')
+
+        # ******** Default destructor ********
+        code('~${{self.c_ident}}() { };')
+
+        # ******** Full init constructor ********
+        if not self.isGlobal:
+            params = [ 'const %s& local_%s' % (dm.type.c_ident, dm.ident) \
+                       for dm in self.data_members.itervalues() ]
+
+            if self.isMessage:
+                params.append('const unsigned local_proc_id')
+            
+            params = ', '.join(params)
+            code('${{self.c_ident}}($params)')
+
+            # Call superclass constructor
+            if "interface" in self:
+                code('    : ${{self["interface"]}}()')
+
+            code('{')
+            code.indent()
+            for dm in self.data_members.values():
+                code('m_${{dm.ident}} = local_${{dm.ident}};')
+                if "nextLineCallHack" in dm:
+                    code('m_${{dm.ident}}${{dm["nextLineCallHack"]}};')
+
+            if self.isMessage:
+                code('proc_id = local_proc_id;')
+            
+            code.dedent()
+            code('}')
+
+        # create a static factory method
+        if "interface" in self:
+            code('''
+static ${{self["interface"]}}* create() {
+    return new ${{self.c_ident}}();
+}
+''')
+
+        # ******** Message member functions ********
+        # FIXME: those should be moved into slicc file, slicc should
+        # support more of the c++ class inheritance
+
+        if self.isMessage:
+            code('''
+Message* clone() const { checkAllocator(); return s_allocator_ptr->allocate(*this); }
+void destroy() { checkAllocator(); s_allocator_ptr->deallocate(this); }
+static Allocator<${{self.c_ident}}>* s_allocator_ptr;
+static void checkAllocator() { if (s_allocator_ptr == NULL) { s_allocator_ptr = new Allocator<${{self.c_ident}}>; }}
+''')
+
+        if not self.isGlobal:
+            # const Get methods for each field
+            code('// Const accessors methods for each field')
+            for dm in self.data_members.values():
+                code('''
+/** \\brief Const accessor method for ${{dm.ident}} field.
+ *  \\return ${{dm.ident}} field
+ */
+const ${{dm.type.c_ident}}& get${{dm.ident}}() const { return m_${{dm.ident}}; }
+''')
+
+            # Non-const Get methods for each field
+            code('// Non const Accessors methods for each field')
+            for dm in self.data_members.values():
+                code('''
+/** \\brief Non-const accessor method for ${{dm.ident}} field.
+ *  \\return ${{dm.ident}} field
+ */
+${{dm.type.c_ident}}& get${{dm.ident}}() { return m_${{dm.ident}}; }
+''')
+
+            #Set methods for each field
+            code('// Mutator methods for each field')
+            for dm in self.data_members.values():
+                code('''
+/** \\brief Mutator method for ${{dm.ident}} field */
+void set${{dm.ident}}(const ${{dm.type.c_ident}}& local_${{dm.ident}}) { m_${{dm.ident}} = local_${{dm.ident}}; }
+''')
+
+        code('void print(ostream& out) const;')
+        code.dedent()
+        code('  //private:')
+        code.indent()
+
+        # Data members for each field
+        for dm in self.data_members.values():
+            if "abstract" not in dm:
+                const = ""
+                init = ""
+
+                # global structure
+                if self.isGlobal:
+                    const = "static const "
+
+                # init value
+                if dm.init_code:
+                    # only global structure can have init value here
+                    assert self.isGlobal
+                    init = " = %s" % (dm.init_code)
+
+                desc = ""
+                if "desc" in dm:
+                    desc = '/**< %s */' % dm["desc"]
+
+                code('$const${{dm.type.c_ident}} m_${{dm.ident}}$init; $desc')
+
+        if self.isMessage:
+            code('unsigned proc_id;')
+
+        code.dedent()
+        code('};')
+
+        code('''
+// Output operator declaration
+ostream& operator<<(ostream& out, const ${{self.c_ident}}& obj);
+
+// Output operator definition
+extern inline
+ostream& operator<<(ostream& out, const ${{self.c_ident}}& obj)
+{
+    obj.print(out);
+    out << flush;
+    return out;
+}
+
+#endif // ${{self.c_ident}}_H
+''')
+
+        code.write(path, "%s.hh" % self.c_ident)
+
+    def printTypeCC(self, path):
+        code = code_formatter()
+
+        code('''
+/** \\file ${{self.c_ident}}.cc
+ *
+ * Auto generated C++ code started by $__file__:$__line__
+ */
+
+#include "mem/protocol/${{self.c_ident}}.hh"
+''')
+
+        if self.isMessage:
+            code('Allocator<${{self.c_ident}}>* ${{self.c_ident}}::s_allocator_ptr = NULL;')
+        code('''
+/** \\brief Print the state of this object */
+void ${{self.c_ident}}::print(ostream& out) const
+{
+    out << "[${{self.c_ident}}: ";
+''')
+
+        # For each field
+        code.indent()
+        for dm in self.data_members.values():
+            code('out << "${{dm.ident}} = " << m_${{dm.ident}} << " ";''')
+
+        if self.isMessage:
+            code('out << "Time = " << getTime() << " ";')
+        code.dedent()
+
+        # Trailer
+        code('''
+    out << "]";
+}''')
+
+        code.write(path, "%s.cc" % self.c_ident)
+
+    def printEnumHH(self, path):
+        code = code_formatter()
+        code('''
+/** \\file ${{self.c_ident}}.hh
+ *
+ * Auto generated C++ code started by $__file__:$__line__
+ */
+#ifndef ${{self.c_ident}}_H
+#define ${{self.c_ident}}_H
+
+#include "mem/ruby/common/Global.hh"
+
+/** \\enum ${{self.c_ident}}
+ *  \\brief ${{self.desc}}
+ */
+enum ${{self.c_ident}} {
+    ${{self.c_ident}}_FIRST,
+''')
+
+        code.indent()
+        # 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 ''
+
+            code('${{self.c_ident}}_${{enum.ident}}$init, /**< $desc */')
+        code.dedent()
+        code('''
+    ${{self.c_ident}}_NUM
+};
+${{self.c_ident}} string_to_${{self.c_ident}}(const string& str);
+string ${{self.c_ident}}_to_string(const ${{self.c_ident}}& obj);
+${{self.c_ident}} &operator++(${{self.c_ident}} &e);
+''')
+
+        # MachineType hack used to set the base component id for each Machine
+        if self.isMachineType:
+            code('''
+int ${{self.c_ident}}_base_level(const ${{self.c_ident}}& obj);
+MachineType ${{self.c_ident}}_from_base_level(int);
+int ${{self.c_ident}}_base_number(const ${{self.c_ident}}& obj);
+int ${{self.c_ident}}_base_count(const ${{self.c_ident}}& obj);
+''')
+
+            for enum in self.enums.itervalues():
+                code('#define MACHINETYPE_${{enum.ident}} 1')
+
+        # Trailer
+        code('''
+ostream& operator<<(ostream& out, const ${{self.c_ident}}& obj);
+
+#endif // ${{self.c_ident}}_H
+''')
+
+        code.write(path, "%s.hh" % self.c_ident)
+
+    def printEnumCC(self, path):
+        code = code_formatter()
+        code('''
+/** \\file ${{self.c_ident}}.hh
+ *
+ * Auto generated C++ code started by $__file__:$__line__
+ */
+
+#include "mem/protocol/${{self.c_ident}}.hh"
+
+''')
+
+        if self.isMachineType:
+            code('#include "mem/protocol/ControllerFactory.hh"')
+            for enum in self.enums.itervalues():
+                code('#include "mem/protocol/${{enum.ident}}_Controller.hh"')
+
+        code('''
+ostream& operator<<(ostream& out, const ${{self.c_ident}}& obj)
+{
+    out << ${{self.c_ident}}_to_string(obj);
+    out << flush;
+    return out;
+}
+
+string ${{self.c_ident}}_to_string(const ${{self.c_ident}}& obj)
+{
+    switch(obj) {
+''')
+
+        # For each field
+        code.indent()
+        for enum in self.enums.itervalues():
+            code('  case ${{self.c_ident}}_${{enum.ident}}:')
+            code('    return "${{enum.ident}}";')
+        code.dedent()
+
+        # Trailer
+        code('''
+      default:
+        ERROR_MSG("Invalid range for type ${{self.c_ident}}");
+        return "";
+    }
+}
+
+${{self.c_ident}} string_to_${{self.c_ident}}(const string& str)
+{
+''')
+
+        # For each field
+        code.indent()
+        code("if (false) {")
+        start = "} else "
+        for enum in self.enums.itervalues():
+            code('${start}if (str == "${{enum.ident}}") {')
+            code('    return ${{self.c_ident}}_${{enum.ident}};')
+        code.dedent()
+
+        code('''
+    } else {
+        WARN_EXPR(str);
+        ERROR_MSG("Invalid string conversion for type ${{self.c_ident}}");
+    }
+}
+
+${{self.c_ident}}& operator++(${{self.c_ident}}& e) {
+    assert(e < ${{self.c_ident}}_NUM);
+    return e = ${{self.c_ident}}(e+1);
+}
+''')
+
+        # MachineType hack used to set the base level and number of
+        # components for each Machine
+        if self.isMachineType:
+            code('''
+/** \\brief returns the base vector index for each machine type to be used by NetDest
+  *
+  * \\return the base vector index for each machine type to be used by NetDest
+  * \\see NetDest.hh
+  */
+int ${{self.c_ident}}_base_level(const ${{self.c_ident}}& obj)
+{
+    switch(obj) {
+''')
+
+            # For each field
+            code.indent()
+            for i,enum in enumerate(self.enums.itervalues()):
+                code('  case ${{self.c_ident}}_${{enum.ident}}:')
+                code('    return $i;')
+            code.dedent()
+
+            # total num
+            code('''
+      case ${{self.c_ident}}_NUM:
+        return ${{len(self.enums)}};
+
+      default:
+        ERROR_MSG("Invalid range for type ${{self.c_ident}}");
+        return -1;
+    }
+}
+
+/** \\brief returns the machine type for each base vector index used by NetDest
+ *
+ * \\return the MachineTYpe
+ */
+MachineType ${{self.c_ident}}_from_base_level(int type)
+{
+    switch(type) {
+''')
+
+            # For each field
+            code.indent()
+            for i,enum in enumerate(self.enums.itervalues()):
+                code('  case $i:')
+                code('    return ${{self.c_ident}}_${{enum.ident}};')
+            code.dedent()
+
+            # Trailer
+            code('''
+      default:
+        ERROR_MSG("Invalid range for type ${{self.c_ident}}");
+        return MachineType_NUM;
+    }
+}
+
+/** \\brief The return value indicates the number of components created
+ * before a particular machine\'s components
+ *
+ * \\return the base number of components for each machine
+ */
+int ${{self.c_ident}}_base_number(const ${{self.c_ident}}& obj)
+{
+    int base = 0;
+    switch(obj) {
+''')
+
+            # For each field
+            code.indent()
+            code('  case ${{self.c_ident}}_NUM:')
+            for enum in reversed(self.enums.values()):
+                code('    base += ${{enum.ident}}_Controller::getNumControllers();')
+                code('  case ${{self.c_ident}}_${{enum.ident}}:')
+            code('    break;')
+            code.dedent()
+
+            code('''
+      default:
+        ERROR_MSG("Invalid range for type ${{self.c_ident}}");
+        return -1;
+    }
+
+    return base;
+}
+
+/** \\brief returns the total number of components for each machine
+ * \\return the total number of components for each machine
+ */
+int ${{self.c_ident}}_base_count(const ${{self.c_ident}}& obj)
+{
+    switch(obj) {
+''')
+
+            # For each field
+            for enum in self.enums.itervalues():
+                code('''
+      case ${{self.c_ident}}_${{enum.ident}}:
+        return ${{enum.ident}}_Controller::getNumControllers();
+''')
+
+            # total num
+            code('''
+      case ${{self.c_ident}}_NUM:
+      default:
+        ERROR_MSG("Invalid range for type ${{self.c_ident}}");
+        return -1;
+    }
+}
+''')
+
+        # Write the file
+        code.write(path, "%s.cc" % self.c_ident)
+
+__all__ = [ "Type" ]
diff --git a/src/mem/slicc/symbols/Var.cc b/src/mem/slicc/symbols/Var.cc
deleted file mode 100644
index a6e8dfd..0000000
--- a/src/mem/slicc/symbols/Var.cc
+++ /dev/null
@@ -1,57 +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/Var.hh"
-#include "mem/slicc/symbols/StateMachine.hh"
-
-Var::Var(string id, const Location& location,
-         Type* type_ptr, string code,
-         const Map<string, string>& pairs,
-         StateMachine* machine_ptr) : Symbol(id, location, pairs)
-{
-  if (machine_ptr == NULL) {
-    m_c_id = id;
-  } else {
-    m_c_id = machine_ptr->toString() + "_" + id;  // Append with machine name
-  }
-
-  m_machine_ptr = machine_ptr;
-  m_type_ptr = type_ptr;
-  m_code = code;
-}
-
-void Var::print(ostream& out) const
-{
-  out << "[Var id: " << m_c_id << "]" << endl;
-}
diff --git a/src/mem/slicc/symbols/Var.hh b/src/mem/slicc/symbols/Var.hh
deleted file mode 100644
index 4cb5042..0000000
--- a/src/mem/slicc/symbols/Var.hh
+++ /dev/null
@@ -1,98 +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.
- */
-
-/*
- * Var.hh
- *
- * Description:
- *
- * $Id$
- *
- * */
-
-#ifndef VAR_H
-#define VAR_H
-
-#include "mem/slicc/slicc_global.hh"
-#include "mem/slicc/symbols/Symbol.hh"
-#include "mem/slicc/symbols/Type.hh"
-
-class StateMachine;
-
-class Var : public Symbol {
-public:
-  // Constructors
-  Var(string id, const Location& location,
-      Type* type_ptr, string code,
-      const Map<string, string>& pairs,
-      StateMachine* machine_ptr = NULL);
-
-  //  Var(string id, const Location& location,
-  //      Type* type_ptr, string code) : Symbol(id, location) { m_type_ptr = type_ptr; m_code = code; }
-
-  // Destructor
-  ~Var() {}
-
-  // Public Methods
-  string cIdent() const { return m_c_id; }
-  void writeCFiles(string path)  {}
-  string getCode() const { return m_code; }
-  Type* getType() const { return m_type_ptr; }
-  StateMachine* getMachine() const { return m_machine_ptr; }
-
-  void print(ostream& out) const;
-private:
-  // Private Methods
-
-  // Private copy constructor and assignment operator
-  Var(const Var& obj);
-  Var& operator=(const Var& obj);
-
-  // Data Members (m_ prefix)
-  string m_c_id;
-  Type* m_type_ptr;
-  string m_code;
-  StateMachine* m_machine_ptr;
-};
-
-// Output operator declaration
-ostream& operator<<(ostream& out, const Var& obj);
-
-// ******************* Definitions *******************
-
-// Output operator definition
-extern inline
-ostream& operator<<(ostream& out, const Var& obj)
-{
-  obj.print(out);
-  out << flush;
-  return out;
-}
-
-#endif //VAR_H
diff --git a/src/mem/slicc/symbols/Var.py b/src/mem/slicc/symbols/Var.py
new file mode 100644
index 0000000..87a101f
--- /dev/null
+++ b/src/mem/slicc/symbols/Var.py
@@ -0,0 +1,50 @@
+# Copyright (c) 1999-2008 Mark D. Hill and David A. Wood
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+from slicc.symbols.Symbol import Symbol
+
+class Var(Symbol):
+    def __init__(self, symtab, ident, location, type, code, pairs,
+                 machine=None):
+        super(Var, self).__init__(symtab, ident, location, pairs)
+
+        if machine:
+            self.c_ident = "%s_%s" % (machine, ident)
+        else:
+            self.c_ident = ident
+
+        self.machine = machine
+        self.type = type
+        self.code = code
+
+    def __repr__(self):
+        return "[Var id: %s]" % (self.c_ident)
+
+    def writeCodeFiles(self, path):
+        pass
+
+__all__ = [ "Var" ]
diff --git a/src/mem/slicc/symbols/__init__.py b/src/mem/slicc/symbols/__init__.py
new file mode 100644
index 0000000..43388a5
--- /dev/null
+++ b/src/mem/slicc/symbols/__init__.py
@@ -0,0 +1,38 @@
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+#
+# Authors: Nathan Binkert
+
+from slicc.symbols.Action import Action
+from slicc.symbols.Event import Event
+from slicc.symbols.Func import Func
+from slicc.symbols.State import State
+from slicc.symbols.StateMachine import StateMachine
+from slicc.symbols.Symbol import Symbol
+from slicc.symbols.SymbolTable import SymbolTable
+from slicc.symbols.Transition import Transition
+from slicc.symbols.Type import Type
+from slicc.symbols.Var import Var
diff --git a/src/mem/slicc/util.py b/src/mem/slicc/util.py
new file mode 100644
index 0000000..abadc3e
--- /dev/null
+++ b/src/mem/slicc/util.py
@@ -0,0 +1,75 @@
+# Copyright (c) 2009 The Hewlett-Packard Development Company
+# 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.
+
+import os
+import sys
+
+def makeDir(path):
+    if os.path.exists(path):
+        if not os.path.isdir(path):
+            raise AttributeError, "%s exists but is not directory" % path
+    else:
+        os.mkdir(path)
+
+class PairContainer(object):
+    def __init__(self, pairs=None):
+        self.pairs = {}
+        if pairs:
+            self.pairs.update(pairs)
+
+    def __contains__(self, item):
+        return item in self.pairs
+
+    def __getitem__(self, item):
+        return self.pairs[item]
+
+    def __setitem__(self, item, value):
+        self.pairs[item] = value
+
+    def get(self, item, failobj=None):
+        return self.pairs.get(item, failobj)
+
+class Location(object):
+    def __init__(self, filename, lineno):
+        self.filename = filename
+        self.lineno = lineno
+
+    def __str__(self):
+        return '%s:%d' % (os.path.basename(self.filename), self.lineno)
+
+    def warning(self, message, *args):
+        if args:
+            message = message % args
+        #raise Exception, "%s: Warning: %s" % (self, message)
+        print >>sys.stderr, "%s: Warning: %s" % (self, message)
+
+    def error(self, message, *args):
+        if args:
+            message = message % args
+        raise Exception, "%s: Error: %s" % (self, message)
+        sys.exit("\n%s: Error: %s" % (self, message))
+
+__all__ = [ 'makeDir', 'PairContainer', 'Location' ]
