use class iterator for mk_connection (all of them)
[pinmux.git] / src / pinmux_generator.py
index 06c45ac67f21c2e1ca96ae8fd9b9ba7ac9c6a53d..b95377b4bad5d00485b4ed2c9fac5d56c8305b0a 100644 (file)
 # ========================================================================
 
 # default module imports
-import os
+import getopt
+import os.path
 import sys
-import time
-import math
-
-# project module imports
-from interface_decl import *
-from interface_def import *
-from params import *
-from wire_def import *
-from actual_pinmux import *
-
-if not os.path.exists("bsv_src"):
-    os.makedirs("bsv_src")
-
-bsv_file = open("./bsv_src/pinmux.bsv", "w")
-
-
-header = '''
-/*
-   This BSV file has been generated by the PinMux tool available at:
-   https://bitbucket.org/casl/pinmux.
-
-   Authors: Neel Gala, Luke
-   Date of generation: ''' + time.strftime("%c") + '''
-*/
-package pinmux;
-
-   typedef struct{
-      Bit#(1) outputval;      // output from core to pad                bit7
-      Bit#(1) output_en;      // output enable from core to pad         bit6
-      Bit#(1) input_en;       // input enable from core to io_cell      bit5
-      Bit#(1) pullup_en;      // pullup enable from core to io_cell     bit4
-      Bit#(1) pulldown_en;    // pulldown enable from core to io_cell   bit3
-      Bit#(1) drivestrength;  // drivestrength from core to io_cell     bit2
-      Bit#(1) pushpull_en;    // pushpull enable from core to io_cell   bit1
-      Bit#(1) opendrain_en;   // opendrain enable form core to io_cell  bit0
-   } GenericIOType deriving(Eq,Bits,FShow);
-
-   interface Ifc_pinmux;
-'''
-footer = '''
-   endmodule
-endpackage
-'''
-# ============================================#
-# ==== populating the file with the code =====#
-# ============================================#
-
-# package and interface declaration followed by the generic io_cell definition
-bsv_file.write(header)
-
-bsv_file.write('''
-
-      // declare the method which will capture the user pin-mux
-      // selection values.The width of the input is dependent on the number
-      // of muxes happening per IO. For now we have a generalized width
-      // where each IO will have the same number of muxes.''')
-
-for cell in muxed_cells:
-    bsv_file.write(mux_interface.format(cell[0],
-                                        int(math.log(len(cell) - 1, 2))))
-
-bsv_file.write('''
-
-      // declare the interface to the IO cells.
-      // Each IO cell will have 8 input field (output from pin mux
-      // and on output field (input to pinmux)''')
-for i in range(0, N_IO):
-    bsv_file.write('''\n      // interface for IO CEll-{0}''')
-    bsv_file.write(io_interface.format(i))
-# ==============================================================
-
-# == create method definitions for all peripheral interfaces ==#
-for i in range(0, N_UART):
-    bsv_file.write('''
-      // interface declaration between UART-{0} and pinmux'''.format(i))
-    bsv_file.write(uartinterface_decl.format(i))
-
-for i in range(0, N_SPI):
-    bsv_file.write('''
-      // interface declaration between SPI-{0} and pinmux'''.format(i))
-    bsv_file.write(spiinterface_decl.format(i))
-
-for i in range(0, N_TWI):
-    bsv_file.write('''
-      // interface declaration between TWI-{0} and pinmux'''.format(i))
-    bsv_file.write(twiinterface_decl.format(i))
-# ==============================================================
-
-# ===== finish interface definition and start module definition=======
-bsv_file.write('''
-   endinterface
-   (*synthesize*)
-   module mkpinmux(Ifc_pinmux);
-''')
-# ====================================================================
-
-# ======================= create wire and registers =================#
-bsv_file.write('''
-      // the followins wires capture the pin-mux selection
-      // values for each mux assigned to a CELL
+from spec import modules, specgen, dummytest
+
+
+def printhelp():
+    print ('''pinmux_generator.py [-o outputdir] [-v|--validate] [-h|--help]
+                                  [-t outputtype] [-s|--spec spec]
+    -s | spec       : generate from spec (python module)
+    -t | outputtype : outputtype, defaults to bsv
+    -o outputdir    : defaults to bsv_src.  also location for reading pinmux.txt
+                      interfaces.txt and *.txt
+    -v | --validate : runs some validation on the pinmux
+    -h | --help     : this help message
 ''')
-for cell in muxed_cells:
-    bsv_file.write(muxwire.format(cell[0], int(math.log(len(cell) - 1, 2))))
-
-
-bsv_file.write(
-    '''\n      // following wires capture the values sent to the IO Cell''')
-for i in range(0, N_IO):
-    bsv_file.write(generic_io.format(i))
 
-for i in range(0, N_UART):
-    bsv_file.write(
-        '''\n      // following wires capture signals to IO CELL if uart-{0} is
-      // allotted to it'''.format(i))
-    bsv_file.write(uartwires.format(i))
 
-for i in range(0, N_SPI):
-    bsv_file.write(
-        '''\n      // following wires capture signals to IO CELL if spi-{0} is
-      // allotted to it'''.format(i))
-    bsv_file.write(spiwires.format(i))
-
-for i in range(0, N_TWI):
-    bsv_file.write(
-        '''\n      // following wires capture signals to IO CELL if twi-{0} is
-      // allotted to it'''.format(i))
-    bsv_file.write(twiwires.format(i))
-bsv_file.write("\n")
-# ====================================================================
-# ========================= Actual pinmuxing ========================#
-bsv_file.write('''
-      /*====== This where the muxing starts for each io-cell======*/
-''')
-bsv_file.write(pinmux)
-bsv_file.write('''
-      /*============================================================*/
-''')
-# ====================================================================
-# ================= interface definitions for each method =============#
-for cell in muxed_cells:
-    bsv_file.write(mux_interface_def.format(cell[0],
-                                            int(math.log(len(cell) - 1, 2))))
-for i in range(0, N_IO):
-    bsv_file.write(io_interface_def.format(i))
-for i in range(0, N_UART):
-    bsv_file.write(uartinterface_def.format(i))
-for i in range(0, N_SPI):
-    bsv_file.write(spiinterface_def.format(i))
-for i in range(0, N_TWI):
-    bsv_file.write(twiinterface_def.format(i))
-bsv_file.write(footer)
-print("BSV file successfully generated: bsv_src/pinmux.bsv")
-# ======================================================================
-bsv_file.close()
+if __name__ == '__main__':
+    try:
+        options, remainder = getopt.getopt(
+            sys.argv[1:],
+            'o:vht:s:',
+            ['output=',
+             'validate',
+             'test',
+             'outputtype=',
+             'spec=',
+             'help',
+             'version=',
+             ])
+    except getopt.GetoptError as err:
+        print ("ERROR: %s" % str(err))
+        printhelp()
+        sys.exit(1)
+
+    output_type = 'bsv'
+    output_dir = None
+    validate = False
+    spec = None
+    pinspec = None
+    testing = False
+    for opt, arg in options:
+        if opt in ('-o', '--output'):
+            output_dir = arg
+        elif opt in ('-s', '--spec'):
+            pinspec = arg
+        elif opt in ('-t', '--outputtype'):
+            output_type = arg
+        elif opt in ('-v', '--validate'):
+            validate = True
+        elif opt in ('--test',):
+            testing = True
+        elif opt in ('-h', '--help'):
+            printhelp()
+            sys.exit(0)
+
+    if pinspec:
+        if pinspec not in modules:
+            print ("ERROR: spec type '%s' does not exist" % pinspec)
+            printhelp()
+            sys.exit(1)
+        module = modules[pinspec]
+
+        fname = os.path.join(output_dir or '', "%s.mdwn" % pinspec)
+        d = os.path.split(fname)[0]
+        if not os.path.exists(d):
+            os.makedirs(d)
+        with open(fname, "w") as of:
+            ps = module.pinspec()
+            pinout, bankspec, pinspec, fixedpins = ps.write(of)
+            if testing:
+                dummytest(ps, output_dir, output_type)
+            else:
+                specgen(of, output_dir, pinout,
+                        bankspec, ps.muxwidths, pinspec, fixedpins, ps.fastbus)
+    else:
+        if output_type == 'bsv':
+            from bsv.pinmux_generator import pinmuxgen as gentypes
+        elif output_type == 'myhdl':
+            from myhdlgen.pinmux_generator import pinmuxgen as gentypes
+        else:
+            print ("ERROR: output type '%s' does not exist" % output_type)
+            printhelp()
+            sys.exit(0)
+
+        gentypes(output_dir, validate)