mess about with resources a bit
[pinmux.git] / src / spec / testing_stage1.py
1 #!/usr/bin/env python3
2 from nmigen.build.dsl import Resource, Subsignal, Pins
3 from nmigen.build.plat import TemplatedPlatform
4 from nmigen import Elaboratable, Signal, Module
5 from collections import OrderedDict
6
7 # Was thinking of using these functions, but skipped for simplicity for now
8 # XXX nope. the output from JSON file.
9 #from pinfunctions import (i2s, lpc, emmc, sdmmc, mspi, mquadspi, spi,
10 # quadspi, i2c, mi2c, jtag, uart, uartfull, rgbttl, ulpi, rgmii, flexbus1,
11 # flexbus2, sdram1, sdram2, sdram3, vss, vdd, sys, eint, pwm, gpio)
12
13 # File for stage 1 pinmux tested proposed by Luke,
14 # https://bugs.libre-soc.org/show_bug.cgi?id=50#c10
15
16
17 def dummy_pinset():
18 # sigh this needs to come from pinmux.
19 gpios = []
20 for i in range(16):
21 gpios.append("%d*" % i)
22 return {'uart': ['tx+', 'rx-'],
23 'gpio': gpios,
24 'i2c': ['sda*', 'scl+']}
25
26 """
27 a function is needed which turns the results of dummy_pinset()
28 into:
29
30 [UARTResource("uart", 0, tx=..., rx=..),
31 I2CResource("i2c", 0, scl=..., sda=...),
32 Resource("gpio", 0, Subsignal("i"...), Subsignal("o"...)
33 Resource("gpio", 1, Subsignal("i"...), Subsignal("o"...)
34 ...
35 ]
36 """
37
38
39 def create_resources(pinset):
40 resources = []
41 for periph, pins in pinset.items():
42 print(periph, pins)
43 if periph == 'i2c':
44 #print("I2C required!")
45 resources.append(I2CResource('i2c', 0, sda='sda', scl='scl'))
46 elif periph == 'uart':
47 #print("UART required!")
48 resources.append(UARTResource('uart', 0, tx='tx', rx='rx'))
49 elif periph == 'gpio':
50 #print("GPIO required!")
51 print ("GPIO is defined as '*' type, meaning i, o and oe needed")
52 ios = []
53 for pin in pins:
54 pname = "gpio"+pin[:-1] # strip "*" on end
55 ios.append(Subsignal(pname, Pins(pname, assert_width=1)))
56 resources.append(Resource.family(periph, 0, default_name="gpio",
57 ios=ios))
58 return resources
59
60
61 def UARTResource(*args, rx, tx):
62 io = []
63 io.append(Subsignal("rx", Pins(rx, dir="i", assert_width=1)))
64 io.append(Subsignal("tx", Pins(tx, dir="o", assert_width=1)))
65 return Resource.family(*args, default_name="uart", ios=io)
66
67
68 def I2CResource(*args, scl, sda):
69 io = []
70 io.append(Subsignal("scl", Pins(scl, dir="io", assert_width=1)))
71 io.append(Subsignal("sda", Pins(sda, dir="io", assert_width=1)))
72 return Resource.family(*args, default_name="i2c", ios=io)
73
74
75 # ridiculously-simple top-level module. doesn't even have a sync domain
76 # and can't have one until a clock has been established by DummyPlatform.
77 class Blinker(Elaboratable):
78 def __init__(self):
79 pass
80 def elaborate(self, platform):
81 m = Module()
82 count = Signal(5)
83 m.d.comb += count.eq(5)
84 print ("resources", platform.resources.items())
85 gpio = platform.request("gpio", 0)
86 print (gpio, gpio.layout, gpio.fields)
87 # get the GPIO bank, mess about with some of the pins
88 m.d.comb += gpio.gpio0.o.eq(1)
89 m.d.comb += gpio.gpio1.o.eq(gpio.gpio2.i)
90 # get the UART resource, mess with the output tx
91 uart = platform.request("uart", 0)
92 print (uart, uart.fields)
93 m.d.comb += uart.tx.eq(1)
94 return m
95
96
97 '''
98 _trellis_command_templates = [
99 r"""
100 {{invoke_tool("yosys")}}
101 {{quiet("-q")}}
102 {{get_override("yosys_opts")|options}}
103 -l {{name}}.rpt
104 {{name}}.ys
105 """,
106 ]
107 '''
108
109 # sigh, have to create a dummy platform for now.
110 # TODO: investigate how the heck to get it to output ilang. or verilog.
111 # or, anything, really. but at least it doesn't barf
112 class DummyPlatform(TemplatedPlatform):
113 connectors = []
114 resources = OrderedDict()
115 required_tools = []
116 command_templates = ['/bin/true']
117 file_templates = {
118 **TemplatedPlatform.build_script_templates,
119 "{{name}}.il": r"""
120 # {{autogenerated}}
121 {{emit_rtlil()}}
122 """,
123 "{{name}}.debug.v": r"""
124 /* {{autogenerated}} */
125 {{emit_debug_verilog()}}
126 """,
127 }
128 toolchain = None
129 def __init__(self, resources):
130 super().__init__()
131 self.add_resources(resources)
132
133 """
134 and to create a Platform instance with that list, and build
135 something random
136
137 p=Platform()
138 p.resources=listofstuff
139 p.build(Blinker())
140 """
141 pinset = dummy_pinset()
142 resources = create_resources(pinset)
143 print(pinset)
144 print(resources)
145 p = DummyPlatform (resources)
146 p.build(Blinker())
147