use class iterator for mk_connection (all of them)
[pinmux.git] / src / pinmux_generator.py
index 654eb6bcc9e3f9fbdb8d276adbd5bd6219e70d89..b95377b4bad5d00485b4ed2c9fac5d56c8305b0a 100644 (file)
-#############################======= Steps to add peripherals =======#######################
-# Step-1:      create interface declaration for the peripheral to be added. Remember these are 
-#                              interfaces defined for the pinmux and hence will be opposite to those defined
-#                              at the peripheral. For eg. the output TX from the UART will be input (method Action)
-#                              for the pinmux. These changes will have to be done in interface_decl.py
-# Step-2               define the wires that will be required to transfer data from the peripheral interface
-#                              to the IO cell and vice-versa. Create a mkDWire for each input/output between the
-#                              the peripheral and the pinmux. Also create an implicit wire of GenericIOType
-#                              for each cell that can be connected to a each bit from the peripheral. 
-#                              These changes will have to be done in wire_def.py
-# Step-3:      create the definitions for each of the methods defined above.                           
-#                              These changes will have to be done in interface_decl.py
-############################################################################################
+# ================================== Steps to add peripherals ============
+# Step-1:   create interface declaration for the peripheral to be added.
+#           Remember these are interfaces defined for the pinmux and hence
+#           will be opposite to those defined at the peripheral.
+#           For eg. the output TX from the UART will be input (method Action)
+#           for the pinmux.
+#           These changes will have to be done in interface_decl.py
+# Step-2    define the wires that will be required to transfer data from the
+#           peripheral interface to the IO cell and vice-versa. Create a
+#           mkDWire for each input/output between the peripheral and the
+#           pinmux. Also create an implicit wire of GenericIOType for each cell
+#           that can be connected to a each bit from the peripheral.
+#           These changes will have to be done in wire_def.py
+# Step-3:   create the definitions for each of the methods defined above.
+#           These changes will have to be done in interface_decl.py
+# ========================================================================
 
 # default module imports
-import os
+import getopt
+import os.path
 import sys
-import time
-
-# 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: <website>.
-       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 i in range(0,N_IO):
-       bsv_file.write(mux_interface.format(i))
-
-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
-       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 i in range(0,N_IO):
-       bsv_file.write(muxwire.format(i))
 
 
-bsv_file.write('''\n           // following wires capture the values to be 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 the parameters to the 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 the parameters to the 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 the parameters to the 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 i in range(0,N_IO):
-       bsv_file.write(mux_interface_def.format(i))
-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)
-########################################################################
+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)