1 # ================================== Steps to add peripherals ============
2 # Step-1: create interface declaration for the peripheral to be added.
3 # Remember these are interfaces defined for the pinmux and hence
4 # will be opposite to those defined at the peripheral.
5 # For eg. the output TX from the UART will be input (method Action)
7 # These changes will have to be done in interface_decl.py
8 # Step-2 define the wires that will be required to transfer data from the
9 # peripheral interface to the IO cell and vice-versa. Create a
10 # mkDWire for each input/output between the peripheral and the
11 # pinmux. Also create an implicit wire of GenericIOType for each cell
12 # that can be connected to a each bit from the peripheral.
13 # These changes will have to be done in wire_def.py
14 # Step-3: create the definitions for each of the methods defined above.
15 # These changes will have to be done in interface_decl.py
16 # ========================================================================
18 # default module imports
23 from spec
import modules
, specgen
, dummytest
24 from spec
.ifaceprint
import create_sv
, temp_create_sv
28 print ('''pinmux_generator.py [-o outputdir] [-v|--validate] [-h|--help]
29 [-t outputtype] [-s|--spec spec]
30 -s | spec : generate from spec (python module)
31 -t | outputtype : outputtype, defaults to bsv
32 -o outputdir : defaults to bsv_src. also location for reading pinmux.txt
33 interfaces.txt and *.txt
34 -v | --validate : runs some validation on the pinmux
35 -h | --help : this help message
39 if __name__
== '__main__':
41 options
, remainder
= getopt
.getopt(
52 except getopt
.GetoptError
as err
:
53 print ("ERROR: %s" % str(err
))
63 for opt
, arg
in options
:
64 if opt
in ('-o', '--output'):
66 elif opt
in ('-s', '--spec'):
68 elif opt
in ('-t', '--outputtype'):
70 elif opt
in ('-v', '--validate'):
72 elif opt
in ('--test',):
74 elif opt
in ('-h', '--help'):
79 if pinspec
not in modules
:
80 print ("ERROR: spec type '%s' does not exist" % pinspec
)
83 module
= modules
[pinspec
]
85 fname
= os
.path
.join(output_dir
or '', "%s.mdwn" % pinspec
)
86 pyname
= os
.path
.join(output_dir
or '', "%s_pins.py" % pinspec
)
87 d
= os
.path
.split(fname
)[0]
88 if not os
.path
.exists(d
):
90 with
open(fname
, "w") as of
:
91 with
open(pyname
, "w") as pyf
:
93 pinout
, bankspec
, pin_spec
, fixedpins
= ps
.write(of
)
94 #chip['litex.map'] = litexmap
96 dummytest(ps
, output_dir
, output_type
)
98 specgen(of
, output_dir
, pinout
,
99 bankspec
, ps
.muxwidths
, pin_spec
, fixedpins
,
101 pm
, chip
= jsoncreate
.pinparse(ps
, pinspec
)
102 litexmap
= ps
.pywrite(pyf
, pm
)
103 jchip
= json
.dumps(chip
)
104 with
open("%s/litex_pinpads.json" % pinspec
, "w") as f
:
106 # octavius: please keep line-lengths to below 80 chars
107 # TODO: fix create_sv to allow different packages
109 # Test with different package size, once working
110 # 'create_sv' will be improved
111 if pinspec
== "ngi_router":
112 temp_create_sv("%s/%s.svg" % (pinspec
, pinspec
), chip
)
113 if pinspec
== "ls180":
114 create_sv("%s/%s.svg" % (pinspec
, pinspec
), chip
)
116 if output_type
== 'bsv':
117 from bsv
.pinmux_generator
import pinmuxgen
as gentypes
118 elif output_type
== 'myhdl':
119 from myhdlgen
.pinmux_generator
import pinmuxgen
as gentypes
121 print ("ERROR: output type '%s' does not exist" % output_type
)
125 gentypes(output_dir
, validate
)