|
1 | 1 | # SPDX-License-Identifier: BSD-2-Clause |
2 | 2 |
|
| 3 | +import logging |
3 | 4 | import os |
4 | 5 | import sys |
5 | 6 | from pathlib import Path |
|
14 | 15 |
|
15 | 16 |
|
16 | 17 | __all__ = ["SimPlatform"] |
| 18 | +logger = logging.getLogger(__name__) |
17 | 19 |
|
18 | 20 |
|
19 | 21 | class SimPlatform: |
@@ -42,6 +44,7 @@ def build(self, e): |
42 | 44 | if port.direction is io.Direction.Bidir: |
43 | 45 | ports.append((f"io${port_name}$oe", port.oe, PortDirection.Output)) |
44 | 46 |
|
| 47 | + print("elaborating design") |
45 | 48 | output = rtlil.convert(e, name="sim_top", ports=ports, platform=self) |
46 | 49 |
|
47 | 50 | top_rtlil = Path(self.build_dir) / "sim_soc.il" |
@@ -73,19 +76,26 @@ def instantiate_ports(self, m: Module): |
73 | 76 | for component, iface in pinlock.port_map.ports.items(): |
74 | 77 | for k, v in iface.items(): |
75 | 78 | for name, port in v.items(): |
| 79 | + logger.debug(f"Instantiating port {port.port_name}: {port}") |
76 | 80 | invert = port.invert if port.invert else False |
77 | 81 | self._ports[port.port_name] = io.SimulationPort(port.direction, port.width, invert=invert, name=f"{component}-{name}") |
78 | 82 |
|
79 | 83 | for clock in pinlock.port_map.get_clocks(): |
80 | | - setattr(m.domains, clock.port_name, ClockDomain(name=clock.port_name)) |
| 84 | + assert 'clock_domain_o' in clock.iomodel |
| 85 | + domain = clock.iomodel['clock_domain_o'] |
| 86 | + logger.debug(f"Instantiating clock buffer for {clock.port_name}, domain {domain}") |
| 87 | + setattr(m.domains, domain, ClockDomain(name=domain)) |
81 | 88 | clk_buffer = io.Buffer(clock.direction, self._ports[clock.port_name]) |
82 | 89 | setattr(m.submodules, "clk_buffer_" + clock.port_name, clk_buffer) |
83 | 90 | m.d.comb += ClockSignal().eq(clk_buffer.i) # type: ignore[reportAttributeAccessIssue] |
84 | 91 |
|
85 | 92 | for reset in pinlock.port_map.get_resets(): |
| 93 | + assert 'clock_domain_o' in reset.iomodel |
| 94 | + domain = reset.iomodel['clock_domain_o'] |
| 95 | + logger.debug(f"Instantiating reset synchronizer for {reset.port_name}, domain {domain}") |
86 | 96 | rst_buffer = io.Buffer(reset.direction, self._ports[clock.port_name]) |
87 | 97 | setattr(m.submodules, reset.port_name, rst_buffer) |
88 | | - ffsync = FFSynchronizer(rst_buffer.i, ResetSignal(name=reset.port_name)) # type: ignore[reportAttributeAccessIssue] |
| 98 | + ffsync = FFSynchronizer(rst_buffer.i, ResetSignal()) # type: ignore[reportAttributeAccessIssue] |
89 | 99 | setattr(m.submodules, reset.port_name + "_sync", ffsync) |
90 | 100 |
|
91 | 101 | self._pinlock = pinlock |
|
0 commit comments