ruby: slicc: have a static MachineType
authorTony Gutierrez <anthony.gutierrez@amd.com>
Mon, 20 Jul 2015 14:15:18 +0000 (09:15 -0500)
committerTony Gutierrez <anthony.gutierrez@amd.com>
Mon, 20 Jul 2015 14:15:18 +0000 (09:15 -0500)
This patch is imported from reviewboard patch 2551 by Nilay.
This patch moves from a dynamically defined MachineType to a statically
defined one.  The need for this patch was felt since a dynamically defined
type prevents us from having types for which no machine definition may
exist.

The following changes have been made:
i. each machine definition now uses a type from the MachineType enumeration
instead of any random identifier.  This required changing the grammar and the
*.sm files.
ii. MachineType enumeration defined statically in RubySlicc_Exports.sm.
* * *
normal protocol fixes for nilay's parser machine type fix

28 files changed:
src/mem/protocol/MESI_Three_Level-L0cache.sm
src/mem/protocol/MESI_Three_Level-L1cache.sm
src/mem/protocol/MESI_Two_Level-L1cache.sm
src/mem/protocol/MESI_Two_Level-L2cache.sm
src/mem/protocol/MESI_Two_Level-dir.sm
src/mem/protocol/MESI_Two_Level-dma.sm
src/mem/protocol/MI_example-cache.sm
src/mem/protocol/MI_example-dir.sm
src/mem/protocol/MI_example-dma.sm
src/mem/protocol/MOESI_CMP_directory-L1cache.sm
src/mem/protocol/MOESI_CMP_directory-L2cache.sm
src/mem/protocol/MOESI_CMP_directory-dir.sm
src/mem/protocol/MOESI_CMP_directory-dma.sm
src/mem/protocol/MOESI_CMP_token-L1cache.sm
src/mem/protocol/MOESI_CMP_token-L2cache.sm
src/mem/protocol/MOESI_CMP_token-dir.sm
src/mem/protocol/MOESI_CMP_token-dma.sm
src/mem/protocol/MOESI_hammer-cache.sm
src/mem/protocol/MOESI_hammer-dir.sm
src/mem/protocol/MOESI_hammer-dma.sm
src/mem/protocol/Network_test-cache.sm
src/mem/protocol/Network_test-dir.sm
src/mem/protocol/RubySlicc_Exports.sm
src/mem/slicc/ast/DeclListAST.py
src/mem/slicc/ast/MachineAST.py
src/mem/slicc/parser.py
src/mem/slicc/symbols/SymbolTable.py
src/mem/slicc/symbols/Type.py

index 30105727c82eb4d47191ee84a9013bc7f7ea2c62..4950d63b2c44e4070833458df6f82f3bccd26c4a 100644 (file)
@@ -26,7 +26,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-machine(L0Cache, "MESI Directory L0 Cache")
+machine(MachineType:L0Cache, "MESI Directory L0 Cache")
  : Sequencer * sequencer;
    CacheMemory * Icache;
    CacheMemory * Dcache;
index c6b4cda649837e2e29d99279899bb3d38224b805..e960486a72ce975e4acb948a29b79640a9b976fa 100644 (file)
@@ -26,7 +26,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-machine(L1Cache, "MESI Directory L1 Cache CMP")
+machine(MachineType:L1Cache, "MESI Directory L1 Cache CMP")
  : CacheMemory * cache;
    int l2_select_num_bits;
    Cycles l1_request_latency := 2;
index b8a4c6220b3b2e4bfcc6e6b9616e983f5bb1b5fc..2242250ad1f33d812e884a2c4842251249f7d4fe 100644 (file)
@@ -26,7 +26,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-machine(L1Cache, "MESI Directory L1 Cache CMP")
+machine(MachineType:L1Cache, "MESI Directory L1 Cache CMP")
  : Sequencer * sequencer;
    CacheMemory * L1Icache;
    CacheMemory * L1Dcache;
index 0fd9028c6a2ad1c427afe8455a85d82b5438ef34..d7a88c199496169a3fcad744b26e03a23c80a79b 100644 (file)
@@ -26,7 +26,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-machine(L2Cache, "MESI Directory L2 Cache CMP")
+machine(MachineType:L2Cache, "MESI Directory L2 Cache CMP")
  : CacheMemory * L2cache;
    Cycles l2_request_latency := 2;
    Cycles l2_response_latency := 2;
index c9fbe38751e8d81b01b47cd2bb8ad252cc69adb0..440114a79128dda5e8d55e874fbe82760c01a943 100644 (file)
@@ -26,7 +26,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-machine(Directory, "MESI Two Level directory protocol")
+machine(MachineType:Directory, "MESI Two Level directory protocol")
  : DirectoryMemory * directory;
    Cycles to_mem_ctrl_latency := 1;
    Cycles directory_latency := 6;
index 84774ede8ad77626db46ac28201f2625ecdb82d6..68cb7e96823042a34377e82bf14561aedcd2f812 100644 (file)
@@ -27,7 +27,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-machine(DMA, "DMA Controller")
+machine(MachineType:DMA, "DMA Controller")
 : DMASequencer * dma_sequencer;
   Cycles request_latency := 6;
 
index 1a83704e2c7002e89930c7f86c51854f691b9de6..0e3e6e1eb4b1c3f5ec3994e480b57906dc413160 100644 (file)
@@ -27,7 +27,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-machine(L1Cache, "MI Example L1 Cache")
+machine(MachineType:L1Cache, "MI Example L1 Cache")
     : Sequencer * sequencer;
       CacheMemory * cacheMemory;
       Cycles cache_response_latency := 12;
index f12e474b0d938e14d5ffebf31f1d275912710e4b..e2d834201f31526f07aa9dbf5f41545e58880fc9 100644 (file)
@@ -27,7 +27,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-machine(Directory, "Directory protocol") 
+machine(MachineType:Directory, "Directory protocol") 
     : DirectoryMemory * directory;
       Cycles directory_latency := 12;
       Cycles to_memory_controller_latency := 1;
index 76d87516ad1f8faa201faaffa81a2ff8160a9228..6032229eef335e7c2d2c8be93e30ed81bcea1cee 100644 (file)
@@ -27,7 +27,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-machine(DMA, "DMA Controller") 
+machine(MachineType:DMA, "DMA Controller") 
     : DMASequencer * dma_sequencer;
       Cycles request_latency := 6;
 
index 1327471fce22bc8dba389fc3fdb37fa6704e4535..0d48e2195b9f44258129c4cffb577995b13f40bd 100644 (file)
@@ -26,7 +26,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-machine(L1Cache, "Directory protocol")
+machine(MachineType:L1Cache, "Directory protocol")
  : Sequencer * sequencer;
    CacheMemory * L1Icache;
    CacheMemory * L1Dcache;
index 07cfe18d3b18b836fcf674abb2a012e72340dae2..4db262cb0b4b91fff9ae5ee499b6268eaa2d0eb8 100644 (file)
@@ -26,7 +26,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-machine(L2Cache, "Token protocol")
+machine(MachineType:L2Cache, "Token protocol")
 : CacheMemory * L2cache;
   Cycles response_latency := 2;
   Cycles request_latency := 2;
index 7175edc8d08bd89618e4e0d3b0b005973c4fd2fa..9b73a2bb2102a1d4a63b38fbaf91292a68b87df5 100644 (file)
@@ -26,7 +26,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-machine(Directory, "Directory protocol")
+machine(MachineType:Directory, "Directory protocol")
 :  DirectoryMemory * directory;
    Cycles directory_latency := 6;
    Cycles to_memory_controller_latency := 1;
index 72dec64662dec53215d0f10f1b9b44ea7a805f6a..5eb2f2587fbd4890f22ab7eebaae6ecbd25b9b99 100644 (file)
@@ -27,7 +27,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-machine(DMA, "DMA Controller")
+machine(MachineType:DMA, "DMA Controller")
     : DMASequencer * dma_sequencer;
       Cycles request_latency := 14;
       Cycles response_latency := 14;
index b8c2da761dcc9b1cf911e163d68be205dcd0a522..7961aa3bebd1ce1d3c502467cfb4fde79ab3464d 100644 (file)
@@ -31,7 +31,7 @@
  *
  */
 
-machine(L1Cache, "Token protocol")
+machine(MachineType:L1Cache, "Token protocol")
  : Sequencer * sequencer;
    CacheMemory * L1Icache;
    CacheMemory * L1Dcache;
index 2ab593394df6e5bd76c83d44dcb371ed8bf33202..c9995011d03ca98fcb3d89edd837099859884ec0 100644 (file)
@@ -26,7 +26,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-machine(L2Cache, "Token protocol")
+machine(MachineType:L2Cache, "Token protocol")
  : CacheMemory * L2cache;
    int N_tokens;
    Cycles l2_request_latency := 5;
index 63790531fdee00e4eaad69186376e334ce569ef9..c3a585b961c4ba84173b20e2194a4e3e5262556e 100644 (file)
@@ -26,7 +26,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-machine(Directory, "Token protocol")
+machine(MachineType:Directory, "Token protocol")
  : DirectoryMemory * directory;
    int l2_select_num_bits;
    Cycles directory_latency := 5;
index efe3db3cd800086fc9422177b6ca9b626a4e3c9f..3b144771d48c8154486d16020abd17fb6ae88f02 100644 (file)
@@ -27,7 +27,7 @@
  */
 
 
-machine(DMA, "DMA Controller")
+machine(MachineType:DMA, "DMA Controller")
     : DMASequencer * dma_sequencer;
       Cycles request_latency := 6;
 
index d4e7d7e3ca7defcd6bb19fc6e8bf3c3410d5eeb8..9b2e4cab3149ad839ca5a28ce0db2d26eb5ccd77 100644 (file)
@@ -33,7 +33,7 @@
  *          Brad Beckmann
  */
 
-machine(L1Cache, "AMD Hammer-like protocol")
+machine(MachineType:L1Cache, "AMD Hammer-like protocol")
     : Sequencer * sequencer;
       CacheMemory * L1Icache;
       CacheMemory * L1Dcache;
index 4f5b00658e32397cc181e865cf9f9ac8d74868f9..42522c7276df3830b7bc894541048544ab126123 100644 (file)
@@ -33,7 +33,7 @@
  *          Brad Beckmann
  */
 
-machine(Directory, "AMD Hammer-like protocol") 
+machine(MachineType:Directory, "AMD Hammer-like protocol") 
     : DirectoryMemory * directory;
       CacheMemory * probeFilter;
       Cycles from_memory_controller_latency := 2;
index 7157082c44a711488529fcdb2662e359f801b257..3592e9991a8c0e93ab8e98adc9a4624d9b4c001d 100644 (file)
@@ -27,7 +27,7 @@
  */
 
 
-machine(DMA, "DMA Controller") 
+machine(MachineType:DMA, "DMA Controller") 
     : DMASequencer * dma_sequencer;
       Cycles request_latency := 6;
 
index dab8f1089ff84ff7b9c31bdc67f68dfe7fa549cc..39ec3b98620d5dd4af3086e9a8eacb82af285d40 100644 (file)
@@ -31,7 +31,7 @@
  */
 
 
-machine(L1Cache, "Network_test L1 Cache")
+machine(MachineType:L1Cache, "Network_test L1 Cache")
     : Sequencer * sequencer;
       Cycles issue_latency := 2;
 
index 6bd6920b34e444bc7698234941a3233afa021532..f7feea4d5ddb717f844133ac3144ff04cdeb3a4e 100644 (file)
@@ -31,7 +31,7 @@
  */
 
 
-machine(Directory, "Network_test Directory")
+machine(MachineType:Directory, "Network_test Directory")
     : MessageBuffer * requestToDir, network="From", virtual_network="0",
             vnet_type = "request";
       MessageBuffer * forwardToDir, network="From", virtual_network="1",
index 7c20692032812ae5432dee8036a562d13187e799..617989d15f6440109286ce3cf19fda79195e44f9 100644 (file)
@@ -173,6 +173,24 @@ enumeration(MemoryControlRequestType, desc="...", default="MemoryControlRequestT
   Default,    desc="Replace this with access_types passed to the DMA Ruby object";
 }
 
+
+// These are statically defined types of states machines that we can have.
+// If you want to add a new machine type, edit this enum.  It is not necessary
+// for a protocol to have state machines defined for the all types here.  But
+// you cannot use anything other than the ones defined here.  Also, a protocol
+// can have only one state machine for a given type.
+enumeration(MachineType, desc="...", default="MachineType_NULL") {
+    L1Cache,     desc="L1 Cache Mach";
+    L2Cache,     desc="L2 Cache Mach";
+    L3Cache,     desc="L3 Cache Mach";
+    Directory,   desc="Directory Mach";
+    DMA,         desc="DMA Mach";
+    Collector,   desc="Collector Mach";
+    L1Cache_wCC, desc="L1 Cache Mach to track cache-to-cache transfer (used for miss latency profile)";
+    L2Cache_wCC, desc="L2 Cache Mach to track cache-to-cache transfer (used for miss latency profile)";
+    NULL,        desc="null mach type";
+}
+
 // MessageSizeType
 enumeration(MessageSizeType, desc="...") {
   Control,    desc="Control Message";
index 36c52007091a65dd4e3dc913678d14996ac07441..4ba41ed6c2d9f0df3278fc3eb68e75dca54b4974 100644 (file)
@@ -45,9 +45,6 @@ class DeclListAST(AST):
         return s
 
     def generate(self):
-        for decl in self.decls:
-            decl.generate()
-
-    def findMachines(self):
         for decl in self.decls:
             decl.findMachines()
+            decl.generate()
index 4487b094ea17558f674a08f4619cd6cc59c2314f..c67d0e6953b3e29e377da919170b46643a8d73b3 100644 (file)
@@ -29,10 +29,10 @@ 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):
+    def __init__(self, slicc, mtype, pairs_ast, config_parameters, decls):
         super(MachineAST, self).__init__(slicc, pairs_ast)
 
-        self.ident = ident
+        self.ident = mtype.value
         self.pairs_ast = pairs_ast
         self.config_parameters = config_parameters
         self.decls = decls
@@ -72,11 +72,5 @@ class MachineAST(DeclAST):
     def findMachines(self):
         mtype = self.ident
         machine_type = self.symtab.find("MachineType", Type)
-        pairs = self.pairs_ast.pairs
-
-        pairs["Primary"] = True
-        if not machine_type.addEnum(mtype, pairs):
+        if not machine_type.checkEnum(mtype):
             self.error("Duplicate machine name: %s:%s" % (machine_type, mtype))
-
-        # Generate code for all the internal decls
-        self.decls.findMachines()
index 364bb92f7a1c0c93adf35a66875fccd217269826..4afe0d36753a251d4d560a1bd1b60e2dd3369c0b 100644 (file)
@@ -62,7 +62,6 @@ class SLICC(Grammar):
         return code
 
     def process(self):
-        self.decl_list.findMachines()
         self.decl_list.generate()
 
     def writeCodeFiles(self, code_path, includes):
@@ -72,10 +71,7 @@ class SLICC(Grammar):
         self.symtab.writeHTMLFiles(html_path)
 
     def files(self):
-        f = set([
-            'MachineType.cc',
-            'MachineType.hh',
-            'Types.hh' ])
+        f = set(['Types.hh'])
 
         f |= self.decl_list.files()
 
@@ -259,11 +255,11 @@ class SLICC(Grammar):
         p[0] = self.parse_file(filename)
 
     def p_decl__machine0(self, p):
-        "decl : MACHINE '(' ident ')' ':' obj_decls '{' decls '}'"
+        "decl : MACHINE '(' enumeration ')' ':' obj_decls '{' decls '}'"
         p[0] = ast.MachineAST(self, p[3], [], p[7], p[9])
 
     def p_decl__machine1(self, p):
-        "decl : MACHINE '(' ident pairs ')' ':' obj_decls '{' decls '}'"
+        "decl : MACHINE '(' enumeration pairs ')' ':' obj_decls '{' decls '}'"
         p[0] = ast.MachineAST(self, p[3], p[4], p[7], p[9])
 
     def p_decl__action(self, p):
index 844e4c63f6e877fb8d7aaf79e326fa5122a12287..e991fec2b93d045ad3c28d5f92f19aa2d824c6df 100644 (file)
@@ -40,12 +40,6 @@ class SymbolTable(object):
         self.sym_map_vec = [ {} ]
         self.machine_components = {}
 
-        pairs = {}
-        pairs["enumeration"] = "yes"
-        location = Location("init", 0, no_warning=not slicc.verbose)
-        MachineType = Type(self, "MachineType", location, pairs)
-        self.newSymbol(MachineType)
-
         pairs = {}
         pairs["primitive"] = "yes"
         pairs["external"] = "yes"
index a3223b3ac37d5e5c9706bbc95148530c5339a499..bd92e20c936188aa7cc8e4f991067adad602a165 100644 (file)
@@ -42,6 +42,7 @@ class Enumeration(PairContainer):
     def __init__(self, ident, pairs):
         super(Enumeration, self).__init__(pairs)
         self.ident = ident
+        self.primary = False
 
 class Type(Symbol):
     def __init__(self, table, ident, location, pairs, machine=None):
@@ -165,6 +166,14 @@ class Type(Symbol):
 
         return True
 
+    ## Used to check if an enum has been already used and therefore
+    ## should not be used again.
+    def checkEnum(self, ident):
+        if ident in self.enums and not self.enums[ident].primary:
+            self.enums[ident].primary = True
+            return True
+        return False
+
     def writeCodeFiles(self, path, includes):
         if self.isExternal:
             # Do nothing
@@ -567,7 +576,7 @@ AccessPermission ${{self.c_ident}}_to_permission(const ${{self.c_ident}}& obj)
 
         if self.isMachineType:
             for enum in self.enums.itervalues():
-                if enum.get("Primary"):
+                if enum.primary:
                     code('#include "mem/protocol/${{enum.ident}}_Controller.hh"')
             code('#include "mem/ruby/common/MachineID.hh"')
 
@@ -706,7 +715,7 @@ ${{self.c_ident}}_base_number(const ${{self.c_ident}}& obj)
             code('  case ${{self.c_ident}}_NUM:')
             for enum in reversed(self.enums.values()):
                 # Check if there is a defined machine with this type
-                if enum.get("Primary"):
+                if enum.primary:
                     code('    base += ${{enum.ident}}_Controller::getNumControllers();')
                 else:
                     code('    base += 0;')
@@ -734,7 +743,7 @@ ${{self.c_ident}}_base_count(const ${{self.c_ident}}& obj)
             # For each field
             for enum in self.enums.itervalues():
                 code('case ${{self.c_ident}}_${{enum.ident}}:')
-                if enum.get("Primary"):
+                if enum.primary:
                     code('return ${{enum.ident}}_Controller::getNumControllers();')
                 else:
                     code('return 0;')