From 6240452f80523138074c00c2512613879ddb75c0 Mon Sep 17 00:00:00 2001
From: Pepping <pepping>
Date: Thu, 28 May 2015 16:25:09 +0000
Subject: [PATCH] Made a lot of changes.

---
 tools/oneclick/base/mmm_gen.py | 346 +++++++++++++++++----------------
 1 file changed, 179 insertions(+), 167 deletions(-)

diff --git a/tools/oneclick/base/mmm_gen.py b/tools/oneclick/base/mmm_gen.py
index c44865ca3e..0a2fa62429 100644
--- a/tools/oneclick/base/mmm_gen.py
+++ b/tools/oneclick/base/mmm_gen.py
@@ -31,7 +31,9 @@ import sys
 import os
 import os.path
 import shutil
+import argparse
 import entity
+import hdl_config
 
 s_header = """--------------------------------------------------------------------------------
 --
@@ -55,16 +57,26 @@ s_header = """------------------------------------------------------------------
 --------------------------------------------------------------------------------
 
 """
-s_libraries = """LIBRARY IEEE, common_lib, unb1_board_lib, mm_lib;
-USE IEEE.STD_LOGIC_1164.ALL;
-USE IEEE.NUMERIC_STD.ALL;
-USE common_lib.common_pkg.ALL;
-USE common_lib.common_mem_pkg.ALL;
-USE unb1_board_lib.unb1_board_pkg.ALL;
-USE unb1_board_lib.unb1_board_peripherals_pkg.ALL;
-USE mm_lib.mm_file_pkg.ALL;
-USE mm_lib.mm_file_unb_pkg.ALL;
-"""
+
+s_libraries = "LIBRARY IEEE, common_lib, unb1_board_lib, mm_lib, eth_lib, technology_lib, tech_tse_lib;\n\
+USE IEEE.STD_LOGIC_1164.ALL;\n\
+USE IEEE.NUMERIC_STD.ALL;\n\
+USE common_lib.common_pkg.ALL;\n\
+USE common_lib.common_mem_pkg.ALL;\n\
+USE common_lib.tb_common_mem_pkg.ALL;\n\
+USE common_lib.common_field_pkg.ALL;\n\
+USE common_lib.common_network_total_header_pkg.ALL;\n\
+USE common_lib.common_network_layers_pkg.ALL;\n\
+USE common_lib.common_mem_pkg.ALL;\n\
+USE unb1_board_lib.unb1_board_pkg.ALL;\n\
+USE unb1_board_lib.unb1_board_peripherals_pkg.ALL;\n\
+USE mm_lib.mm_file_pkg.ALL;\n\
+USE mm_lib.mm_file_unb_pkg.ALL;\n\
+USE eth_lib.eth_pkg.ALL;\n\
+USE technology_lib.technology_pkg.ALL;\n\
+USE tech_tse_lib.tech_tse_pkg.ALL;\n\
+USE tech_tse_lib.tb_tech_tse_pkg.ALL;\n\n"
+
 s_signals_clk = "SIGNAL i_mm_clk   : STD_LOGIC := '1';\n\
 SIGNAL i_dp_clk   : STD_LOGIC := '1';\n"
 
@@ -81,6 +93,32 @@ i_mm_clk   <= NOT i_mm_clk AFTER c_mm_clk_period/2;\n"
 
 s_fileio_dp_clk = "i_dp_clk   <= NOT i_dp_clk AFTER c_dp_clk_period/2;\n"
 
+s_fileio_eth_init = "----------------------------------------------------------------------------\n\
+-- 1GbE setup sequence normally performed by unb_os@NIOS\n\
+----------------------------------------------------------------------------\n\
+p_eth_setup : PROCESS\n\
+BEGIN\n\
+  sim_eth_mm_bus_switch <= '1';\n\
+  eth1g_tse_mosi.wr <= '0';\n\
+  eth1g_tse_mosi.rd <= '0';\n\
+  WAIT FOR 400 ns;\n\
+  WAIT UNTIL rising_edge(mm_clk);\n\
+  proc_tech_tse_setup(c_tech_stratixiv, FALSE, c_tech_tse_tx_fifo_depth, c_tech_tse_rx_fifo_depth, c_tech_tse_tx_ready_latency, c_sim_eth_src_mac, sim_eth_psc_access, mm_clk, eth1g_tse_miso, eth1g_tse_mosi);\n\
+  -- Enable RX\n\
+  proc_mem_mm_bus_wr(c_eth_reg_control_wi+0, c_sim_eth_control_rx_en, mm_clk, eth1g_reg_miso, sim_eth1g_reg_mosi);  -- control rx en\n\
+  sim_eth_mm_bus_switch <= '0';\n\
+  WAIT;\n\
+END PROCESS;\n\
+\n\
+p_switch : PROCESS(sim_eth_mm_bus_switch, sim_eth1g_reg_mosi, i_eth1g_reg_mosi)\n\
+BEGIN\n\
+  IF sim_eth_mm_bus_switch = '1' THEN\n\
+    eth1g_reg_mosi <= sim_eth1g_reg_mosi;\n\
+  ELSE\n\
+    eth1g_reg_mosi <= i_eth1g_reg_mosi;\n\
+  END IF;\n\
+END PROCESS;\n"
+
 s_fileio_poll = "----------------------------------------------------------------------------\n\
 -- Procedure that polls a sim control file that can be used to e.g. get\n\
 -- the simulation time in ns\n\
@@ -101,12 +139,11 @@ peripherals_vhdl2python = { 'reg_wdi'             : "reg_wdi",\
                             'rom_unb_system_info' : "rom_system_info",\
                             'reg_unb_sens'        : "reg_unb_sens",\
                             'reg_ppsh'            : "pio_pps",\
-                            'reg_eth'             : "avs_eth_0_mms_reg"}
-
+                            'eth1g_reg'           : "avs_eth_0_mms_reg"}
 
 class QsysEntity(entity.Entity): 
     
-    def make_qsys_instance(self, peripherals): 
+    def make_qsys_instance(self, mmm_conf): 
         s_start = "u_" + self.name + " : " + self.name + "\n" + self.s_port_map_start 
         self.portNames.sort()
         s_port_connects = ""
@@ -121,7 +158,7 @@ class QsysEntity(entity.Entity):
                 else:
                     s_connect =  s_reg_name + "_mosi.address("
                     
-                span = self.find_span(s_reg_name, peripherals) 
+                span = self.find_span(s_reg_name, mmm_conf.peripherals) 
                 if span == 1: 
                     s_connect = s_connect + "0),"
                 else:
@@ -150,9 +187,9 @@ class QsysEntity(entity.Entity):
                 if s_reg_name[-1].isdigit():
                     s_index    = s_reg_name.rsplit("_", 1)[1]
                     s_reg_name = s_reg_name.rsplit("_", 1)[0]
-                    s_connect =  s_reg_name + "_mosi_arr(" + s_index + ").rddata(c_word_w-1 DOWNTO 0),"
+                    s_connect =  s_reg_name + "_miso_arr(" + s_index + ").rddata(c_word_w-1 DOWNTO 0),"
                 else:
-                    s_connect =  s_reg_name + "_mosi.rddata(c_word_w-1 DOWNTO 0),"
+                    s_connect =  s_reg_name + "_miso.rddata(c_word_w-1 DOWNTO 0),"
 
             if "_writedata_export" in s:  
                 s_reg_name = self.name_convert(s.split("_writedata_export")[0])
@@ -190,43 +227,16 @@ class QsysEntity(entity.Entity):
             if "out_port_from_the_pio_wdi" in s:  
                 s_connect =  "pout_wdi,"
 
-            # mm_clk + PLL's
-            if "mm_clk" in s:  
-                s_connect =  "i_mm_clk,"
-
-            if "epcs_clk" in s:  
-                s_connect =  "OPEN,"
-
-            if s == "reset_n":  
-                s_connect =  "xo_rst_n,"
+            # mm_clk 
+            if "clk_in_clk" in s:  
+                s_connect =  "mm_clk,"
 
-            if "altpll_0_locked_export" in s:  
-                s_connect =  "mm_locked,"
-
-            if "altpll_1_locked_export" in s:  
-                s_connect =  "OPEN,"
-
-            if "altpll_1_c0_clk" in s:  
-                s_connect =  "i_dp_clk,"
-
-            if "_areset_export" in s:  
-                s_connect =  "xo_rst,"
+            if s == "reset_in_reset_n":  
+                s_connect =  "mm_rst,"
 
             if "_phasedone_export" in s:  
                 s_connect =  "OPEN,"
 
-            if "clk_0" in s:  
-                s_connect =  "xo_clk,"
-
-            if "board_clk_clk" in s:  
-                s_connect =  "board_clk,"
-
-            if "board_reset_reset" in s:  
-                s_connect =  "board_reset_n,"
-
-            if "altpll_0_c3_clk" in s:  
-                s_connect =  "OPEN,"
-
             s_port_connects = s_port_connects + "  " + s.ljust(self.longestPortName) + " => " + s_connect + "\n"
         
         s_port_connects = s_port_connects.rsplit(",",1)[0] + "\n"
@@ -247,21 +257,74 @@ class QsysEntity(entity.Entity):
                 span = int(peripherals[i][2])
         return span  
 
+class MmmEntity(entity.Entity): 
+    
+    def __init__(self, mmm_conf):  
+        entity.Entity.__init__(self, mmm_conf.mmmName)
+        # Add default generics
+        self.add_generic( "g_sim",         "BOOLEAN", "FALSE")
+        self.add_generic( "g_sim_unb_nr",  "NATURAL", "0")
+        self.add_generic( "g_sim_node_nr", "NATURAL", "0")
+        
+        # Add input clks
+        if "mm_clk" in mmm_conf.input_clks:
+            self.add_port("mm_clk",     "IN", "STD_LOGIC", "\'1\'")      
+            self.add_port("mm_rst",     "IN", "STD_LOGIC", "\'1\'")              
+        
+        # Add UNB1 board peripherals
+        for s in mmm_conf.unb1_board_peripherals:   
+            
+            # Extra signals for ethernet peripheral
+            if(s[0] == "eth1g_ram"): 
+                self.add_port("eth1g_tse_clk",       "OUT", "STD_LOGIC")      
+                self.add_port("eth1g_mm_rst",        "OUT", "STD_LOGIC")    
+                self.add_port("eth1g_reg_interrupt", "IN", "STD_LOGIC")   
+            
+            # Extra signal for Watchdog interface
+            if(s[0] == "reg_wdi"):                              
+                self.add_port("pout_wdi", "OUT",  "STD_LOGIC", "\'1\'") 
+                
+            if(int(s[1]) == 1):                   
+                self.add_port(s[0] + "_mosi",     "OUT", "t_mem_mosi")      
+                self.add_port(s[0] + "_miso",     "IN", "t_mem_miso", "c_mem_miso_rst") 
+            elif(int(s[1]) > 1):
+                self.add_port(s[0] + "_mosi_arr", "OUT", "t_mem_mosi_arr(" + str(int(s[1])-1) + " DOWNTO 0)")      
+                self.add_port(s[0] + "_miso_arr", "IN", "t_mem_miso_arr(" + str(int(s[1])-1) + " DOWNTO 0)", "(others => c_mem_miso_rst)") 
+        
+        # Add custom peripherals
+        for s in mmm_conf.custom_peripherals:
+            if(int(s[1]) == 1): 
+                self.add_port(s[0] + "_mosi", "OUT", "t_mem_mosi")      
+                self.add_port(s[0] + "_miso", "IN", "t_mem_miso", "c_mem_miso_rst") 
+            elif(int(s[1]) > 1):
+                self.add_port(s[0] + "_mosi_arr", "OUT", "t_mem_mosi_arr(" + str(int(s[1])-1) + " DOWNTO 0)")      
+                self.add_port(s[0] + "_miso_arr", "IN", "t_mem_miso_arr(" + str(int(s[1])-1) + " DOWNTO 0)", "(others => c_mem_miso_rst)") 
+
 class MmmGenerate:
 
-    def __init__(self, mmmDir, mmmFileName='mmm.cfg'):
+    def __init__(self, mmmRootDir, mmmFileName='mmm.cfg', mmmLibraryName=''):
         """
         """
-        self.mmmDir = mmmDir
+        self.mmmRootDir = mmmRootDir
         self.mmmFileName = mmmFileName
-        
+        self.mmmLibraryName = mmmLibraryName
         # mmm config files
-        self.mmm = common_dict_file.CommonDictFile(mmmDir, mmmFileName)        # library dict files
+        self.mmm = common_dict_file.CommonDictFile(mmmRootDir, mmmFileName)        # library dict files
         if self.mmm.nof_dicts==0: sys.exit('Error : No mmm config file found')
+        if self.mmmLibraryName=='': sys.exit('Error: No mmmLibraryName specified');
+        
+        for d in self.mmm.dicts:
+            name = self.mmm.get_key_value('mmm_name', d)
+            if name == mmmLibraryName:
+                self.mmm.remove_all_but_the_dict_from_list(d)
 
         # Keep list of HDL library names
-        self.mmm_name                    = "mmm_" + self.mmm.get_key_values('mmm_name')
-        self.VhdlFileName                = self.mmm_name + '.vhd'
+        self.designName                  = self.mmm.get_key_values('mmm_name')
+        self.mmmName                     = "mmm_" + self.mmm.get_key_values('mmm_name')
+        self.VhdlFilePath                = self.mmm.filePaths[0] + '/../vhdl/'
+        self.VhdlFileName                = self.mmmName + '.vhd'
+        self.QsysName                    = "qsys_" + self.designName
+        self.QsysFileName                = self.QsysName + '.vhd'
         self.input_clks                  = self.mmm.get_key_values('input_clks') 
         self.output_clks                 = self.mmm.get_key_values('output_clks') 
         self.unb1_board_peripherals_temp = self.mmm.get_key_values('unb1_board_peripherals').split() 
@@ -271,25 +334,11 @@ class MmmGenerate:
         self.peripherals                 = self.unb1_board_peripherals + self.custom_peripherals
         self.mm_clk_period               = self.mmm.get_key_values('sim_mm_clk_period')
         self.dp_clk_period               = self.mmm.get_key_values('sim_dp_clk_period')  
-        self.QsysName                    = "qsys_" + self.mmm.get_key_values('mmm_name')
-        self.QsysFileName                = self.QsysName + '.vhd'
          
     def chunks(self, l, n):
         n = max(1, n)
         return [l[i:i + n] for i in range(0, len(l), n)]        
         
-    def make_mm_port_map_string(self, peripheral):
-        print peripheral
-        if(int(peripheral[1]) == 1):
-            port_mosi = "\n" + peripheral[0] + "_mosi                   : OUT t_mem_mosi;\n"
-            port_miso = "" + peripheral[0] + "_miso                   : IN  t_mem_miso;\n"
-            port_string = port_mosi + port_miso
-        elif(int(peripheral[1]) > 1):
-            port_mosi = "\n" + peripheral[0] + "_mosi_arr               : OUT t_mem_mosi_arr(" + str(int(peripheral[1])-1) + " DOWNTO 0);\n"
-            port_miso = "" + peripheral[0] + "_miso_arr               : IN  t_mem_miso_arr(" + str(int(peripheral[1])-1) + " DOWNTO 0);\n"
-            port_string = port_mosi + port_miso
-        return port_string
-
     def make_mm_file_io_entry(self, peripheral):        
         if peripheral[0] in peripherals_vhdl2python:
             python_name = peripherals_vhdl2python[peripheral[0]].upper()
@@ -297,150 +346,113 @@ class MmmGenerate:
             python_name = peripheral[0].upper()
         file_io_entry = "" 
         if(int(peripheral[1]) == 1):
-            file_io_entry = "u_mm_file_" + peripheral[0] + "  :  mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & " + r'"' + python_name + r'"' + ")\n      PORT MAP(mm_rst, i_mm_clk, " + peripheral[0] + "_mosi, " + peripheral[0] + "_miso );\n"
+            file_io_entry = "u_mm_file_" + peripheral[0] + "  :  mm_file GENERIC MAP(mmf_unb_file_prefix(g_sim_unb_nr, c_sim_node_nr, c_sim_node_type) & " + r'"' + python_name + r'"' + ")\n      PORT MAP(mm_rst, mm_clk, " + peripheral[0] + "_mosi, " + peripheral[0] + "_miso );\n"
         return file_io_entry
     
-    def read_entity_from_file(self, path, name):
-        f = file((path + name + ".vhd"), "r")
-        s_return = ""
-        s = ""
-        while not('entity ' + name) in s:
-            s = f.readline() 
-        s_return = s_return + s    
-        while not('end entity') in s:
-            s = f.readline() 
-            # remove comments
-            i = s.find('--')
-            if i != -1: 
-                s=s[0:i] + "\n"
-            s_return = s_return + s    
-        f.close()
-        return s_return
-
 if __name__ == '__main__':
-    mmmDir = '../../../applications/apertif/designs/apertif_unb1_correlator/src/python/'
-    buildDir = '../../../build/quartus/apertif_unb1_correlator/qsys_apertif_unb1_correlator/simulation/'
-    mm_dir = '../../../../../UniBoard/trunk/Firmware/modules/mm/tb/vhdl/'
-    mm_file = "mm_file"
+
+    # Parse command line arguments
+    toolsetSelect = ['unb1', 'unb2']
+    
+    argparser = argparse.ArgumentParser(description='Create Memory Mapped Master entity for specified design name')
+    argparser.add_argument('-t','--toolset', help='choose toolset %s (default: %s)' % (toolsetSelect,toolsetSelect[0]), default=toolsetSelect[0], required=False)
+    argparser.add_argument('-v','--verbosity', help='verbosity >= 0 for more info', type=int, default=0, required=False)
+    argparser.add_argument('-l','--library', help='specify the library name of the design', default='', required=True)
+    args = vars(argparser.parse_args())
+    arg_verbosity = args['verbosity']
+    arg_library   = args['library']
+    arg_toolset   = args['toolset']
+    if arg_toolset not in toolsetSelect:
+        print 'Toolset %s is not supported' % arg_toolset
+        print 'Hint: give argument -h for possible options'
+        sys.exit(1)
+    toolFileName = 'hdltool_' + arg_toolset + '.cfg'
+
+      
+    designName  = arg_library # "unb1_terminal_bg_mesh_db"
+    libRootDir  = 'RADIOHDL'
+    mmmRootDir  = os.environ['RADIOHDL']
     mmmFileName = 'mmm.cfg'
-    mmm_conf = MmmGenerate( mmmDir = mmmDir, mmmFileName=mmmFileName)
+    mm_dir      = '../../../../../UniBoard/trunk/Firmware/modules/mm/tb/vhdl/'
+    mm_file     = "mm_file"
+    
+    mmm_conf = MmmGenerate( mmmRootDir = mmmRootDir, mmmFileName=mmmFileName, mmmLibraryName = designName)
+    QsysBuildDir = os.environ['RADIOHDL']+'/build/' + arg_toolset + '/quartus/' + designName +'/qsys_' + designName + '/simulation/'
 
     ###################################    
     # Define the entity definitions
     ###################################
     ent_qsys    = QsysEntity()
-    ent_mmm     = entity.Entity(name = mmm_conf.mmm_name) 
+    ent_mmm     = MmmEntity(mmm_conf) 
     ent_mm_file = entity.Entity()
     
     ###################################    
     # Read the Qsys entity definition
     ###################################
-    ent_qsys.read_entity_from_file(buildDir, mmm_conf.QsysName)
-    s_qsys_comp = ent_qsys.make_component_instance(indend = 0)
+    ent_qsys.read_entity_from_file(QsysBuildDir, mmm_conf.QsysName)
+    ent_qsys.replace_std_logic_vector_with_std_logic()
+    s_qsys_comp = ent_qsys.make_component_definition(indend = 0)
    
     ###################################    
     # Read the mm_file entity definition
     ###################################
     ent_mm_file.read_entity_from_file(mm_dir, mm_file)
-    s_mm_file_comp = ent_mm_file.make_component_instance(indend = 0)
+    s_mm_file_comp = ent_mm_file.make_component_definition(indend = 0)
 
     ###################################    
-    # Make the entity definition
+    # Make the entity definition and a 
+    # commented instantiation. 
     ###################################
-    # Start with entity header
-    s_arch_content = ""
-    s_arch_file = ""
-    
-    # Add input clks
-    if "xo_clk" in mmm_conf.input_clks:
-        ent_mmm.add_port("xo_clk",   "IN", "STD_LOGIC", "1")
-        ent_mmm.add_port("xo_rst_n", "IN", "STD_LOGIC", "0")
-        ent_mmm.add_port("xo_rst",   "IN", "STD_LOGIC", "0")
-    if "board_clk" in mmm_conf.input_clks:
-        ent_mmm.add_port("board_clk",     "IN", "STD_LOGIC", "1")      
-        ent_mmm.add_port("board_reset_n", "IN", "STD_LOGIC", "1")              
-
-    # Add output clks
-    if "mm_clk" in mmm_conf.output_clks:
-        ent_mmm.add_port("mm_clk",    "OUT", "STD_LOGIC")      
-        ent_mmm.add_port("mm_rst",    "IN" , "STD_LOGIC", "1")      
-        ent_mmm.add_port("mm_locked", "OUT", "STD_LOGIC" )      
-        s_arch_content = s_arch_content + s_connect_mm_clk
-        s_arch_file    = s_arch_file    + s_fileio_mm_clk
-    if "dp_clk" in mmm_conf.output_clks:
-        ent_mmm.add_port("dp_clk", "OUT", "STD_LOGIC", "1")      
-        s_arch_content = s_arch_content + s_connect_dp_clk
-        s_arch_file    = s_arch_file    + s_fileio_dp_clk
-
-    # Add UNB1 board peripherals
-    # 1GbE control interface always:
-    ent_mmm.add_port("eth1g_tse_clk",       "OUT", "STD_LOGIC")      
-    ent_mmm.add_port("eth1g_mm_rst",        "OUT", "STD_LOGIC")      
-    ent_mmm.add_port("eth1g_tse_mosi",      "OUT", "t_mem_mosi")  
-    ent_mmm.add_port("eth1g_tse_miso",      "IN" , "t_mem_miso", "c_mem_miso_rst")  
-    ent_mmm.add_port("eth1g_reg_mosi",      "OUT", "t_mem_mosi")  
-    ent_mmm.add_port("eth1g_reg_miso",      "IN" , "t_mem_miso", "c_mem_miso_rst")  
-    ent_mmm.add_port("eth1g_reg_interrupt", "IN",  "STD_LOGIC")
-    ent_mmm.add_port("eth1g_ram_mosi",      "OUT", "t_mem_mosi")  
-    ent_mmm.add_port("eth1g_ram_miso",      "IN",  "t_mem_miso", "c_mem_miso_rst")
-    
-    for s in mmm_conf.unb1_board_peripherals:
-        if(int(s[1]) == 1): 
-            ent_mmm.add_port(s[0] + "_mosi", "OUT", "t_mem_mosi")      
-            ent_mmm.add_port(s[0] + "_miso", "IN",  "t_mem_miso", "c_mem_miso_rst") 
-        elif(int(s[1]) > 1):
-            ent_mmm.add_port(s[0] + "_mosi_arr", "OUT", "t_mem_mosi_arr(" + str(int(s[1])-1) + " DOWNTO 0)")      
-            ent_mmm.add_port(s[0] + "_miso_arr", "IN",  "t_mem_miso_arr(" + str(int(s[1])-1) + " DOWNTO 0)", "(others => c_mem_miso_rst)") 
-        s_arch_file = s_arch_file + mmm_conf.make_mm_file_io_entry(s)
-    
-    # Add reg_wdi port if included
-    if "reg_wdi" in mmm_conf.unb1_board_peripherals:
-        ent_mmm.add_port("pout_wdi", "OUT",  "STD_LOGIC", "1") 
-    
-    # Add custom peripherals
-    for s in mmm_conf.custom_peripherals:
-        if(int(s[1]) == 1): 
-            ent_mmm.add_port(s[0] + "_mosi", "OUT", "t_mem_mosi")      
-            ent_mmm.add_port(s[0] + "_miso", "IN",  "t_mem_miso", "c_mem_miso_rst") 
-        elif(int(s[1]) > 1):
-            ent_mmm.add_port(s[0] + "_mosi_arr", "OUT", "t_mem_mosi_arr(" + str(int(s[1])-1) + " DOWNTO 0)")      
-            ent_mmm.add_port(s[0] + "_miso_arr", "IN",  "t_mem_miso_arr(" + str(int(s[1])-1) + " DOWNTO 0)", "(others => c_mem_miso_rst)") 
-        s_arch_file = s_arch_file + mmm_conf.make_mm_file_io_entry(s)
-    
-    s_entity = ent_mmm.make_entity_instance()
-    
+    s_entity = ent_mmm.make_entity_definition()
+    s_instantiation = ent_mmm.comment(ent_mmm.make_instantiation())
+
     ###################################    
     # Make the architecture header
     ###################################
-    s_arch_start = "ARCHITECTURE str OF "+ str(mmm_conf.mmm_name) + " IS\n\n" 
+    s_arch_start = "ARCHITECTURE str OF "+ str(mmm_conf.mmmName) + " IS\n\n" 
     s_arch_constants = ""
     s_arch_constants = s_arch_constants + "CONSTANT c_mm_clk_period   : TIME := " + str(mmm_conf.mm_clk_period) + " ns;\n"
     s_arch_constants = s_arch_constants + "CONSTANT c_dp_clk_period   : TIME := " + str(mmm_conf.dp_clk_period) + " ns;\n"
     s_arch_constants = s_arch_constants + "CONSTANT c_sim_node_type   : STRING(1 TO 2):= sel_a_b(g_sim_node_nr<4, " + r'"FN", "BN"' + ");\n"
     s_arch_constants = s_arch_constants + "CONSTANT c_sim_node_nr     : NATURAL := sel_a_b(c_sim_node_type=" + r'"BN"' +", g_sim_node_nr-4, g_sim_node_nr);\n"
     
+    s_arch_constants = s_arch_constants + "CONSTANT c_sim_eth_src_mac : STD_LOGIC_VECTOR(c_network_eth_mac_slv'RANGE) := X\"00228608\" & TO_UVEC(g_sim_unb_nr, c_byte_w) & TO_UVEC(g_sim_node_nr, c_byte_w);"
+    s_arch_constants = s_arch_constants + "CONSTANT c_sim_eth_control_rx_en : NATURAL := 2**c_eth_mm_reg_control_bi.rx_en;"
+
+    s_arch_signals = ""
+    s_arch_signals = s_arch_signals + "SIGNAL sim_eth_mm_bus_switch   : STD_LOGIC;\n"
+    s_arch_signals = s_arch_signals + "SIGNAL sim_eth_psc_access      : STD_LOGIC;\n"
+    s_arch_signals = s_arch_signals + "SIGNAL i_eth1g_reg_mosi        : t_mem_mosi;\n"
+    s_arch_signals = s_arch_signals + "SIGNAL i_eth1g_reg_miso        : t_mem_miso;\n"
+    s_arch_signals = s_arch_signals + "SIGNAL sim_eth1g_reg_mosi      : t_mem_mosi;\n"
+    
     s_arch_components = s_mm_file_comp + s_qsys_comp
-    s_arch_header     = s_arch_start + ent_qsys.apply_indend(s_arch_constants + "\n" + s_arch_components + s_signals_clk, 2)
+    s_arch_header     = s_arch_start + ent_qsys.apply_indend(s_arch_constants + "\n" + s_arch_signals + "\n" + s_arch_components, 2)
 
     ###################################    
     # Make the architecture content
     ###################################
+    s_arch_file = ""
+    for s in mmm_conf.unb1_board_peripherals:
+        s_arch_file = s_arch_file + mmm_conf.make_mm_file_io_entry(s)
+    for s in mmm_conf.custom_peripherals:
+        s_arch_file = s_arch_file + mmm_conf.make_mm_file_io_entry(s)
+
     # Make File I/O master
-    eth_peripheral = ['reg_eth', '1', '8']
-    s_arch_file    = s_arch_file + mmm_conf.make_mm_file_io_entry(eth_peripheral)
-    s_file    = s_fileio_start + ent_qsys.apply_indend(s_arch_file + s_fileio_poll, 2) + s_end_generate + "\n"
+    s_file    = s_fileio_start + ent_qsys.apply_indend(s_arch_file + s_fileio_eth_init + s_fileio_poll, 2) + s_end_generate + "\n"
 
     # Make QSYS master
     s_master_start = s_master_header + "gen_" + ent_qsys.name + " : IF g_sim = FALSE GENERATE\n" 
-    s_master = s_master_start + ent_qsys.apply_indend(ent_qsys.make_qsys_instance(mmm_conf.peripherals), 2) + s_end_generate + "\n"
+    s_master = s_master_start + ent_qsys.apply_indend(ent_qsys.make_qsys_instance(mmm_conf), 2) + s_end_generate + "\n"
 
-    s_arch_total = s_arch_begin + ent_qsys.apply_indend(s_arch_content + s_file + s_master, 2) + s_arch_end
-    string_elements = [s_header, s_libraries, s_entity, s_arch_header, s_arch_total ]
+    s_arch_total = s_arch_begin + ent_qsys.apply_indend(s_file + s_master, 2) + s_arch_end
+    string_elements = [s_header, s_instantiation, s_libraries, s_entity, s_arch_header, s_arch_total ]
     
     ###################################    
     # Write the whole string to a file
     ###################################
-    f = file(mmm_conf.VhdlFileName, "w")
+    fileName = mmm_conf.VhdlFilePath + mmm_conf.VhdlFileName
+    f = file(fileName, "w")
     for s in string_elements:
         f.write(s)        
     f.close()
-- 
GitLab