1 from abc
import abstractproperty
4 from ..lib
.cdc
import ResetSynchronizer
8 __all__
= ["QuicklogicPlatform"]
11 class QuicklogicPlatform(TemplatedPlatform
):
20 * ``symbiflow_write_fasm``
21 * ``symbiflow_write_bitstream``
22 The environment is populated by running the script specified in the environment variable
23 ``NMIGEN_ENV_QLSymbiflow``, if present.
25 * ``add_constraints``: inserts commands in XDC file.
28 device
= abstractproperty()
29 part
= abstractproperty()
31 # Since the QuickLogic version of SymbiFlow toolchain is not upstreamed yet
32 # we should distinguish the QuickLogic version from mainline one.
33 # QuickLogic toolchain: https://github.com/QuickLogic-Corp/quicklogic-fpga-toolchain/releases
34 toolchain
= "QLSymbiflow"
41 "symbiflow_write_fasm",
42 "symbiflow_write_bitstream"
45 **TemplatedPlatform
.build_script_templates
,
47 /* {{autogenerated}} */
50 "{{name}}.debug.v": r
"""
51 /* {{autogenerated}} */
52 {{emit_debug_verilog()}}
56 {% for port_name, pin_name, attrs in platform.iter_port_constraints_bits() -%}
57 set_io {{port_name}} {{pin_name}}
62 {% for port_name, pin_name, attrs in platform.iter_port_constraints_bits() -%}
63 {% for attr_name, attr_value in attrs.items() -%}
64 set_property {{attr_name}} {{attr_value}} [get_ports {{port_name|tcl_escape}} }]
67 {{get_override("add_constraints")|default("# (add_constraints placeholder)")}}
71 {% for net_signal, port_signal, frequency in platform.iter_clock_constraints() -%}
72 {% if port_signal is not none -%}
73 create_clock -period {{100000000/frequency}} {{port_signal.name|ascii_escape}}
80 {{invoke_tool("symbiflow_synth")}}
82 -v {% for file in platform.iter_extra_files(".v", ".sv", ".vhd", ".vhdl") -%} {{file}} {% endfor %} {{name}}.v
83 -d {{platform.device}}
89 {{invoke_tool("symbiflow_pack")}}
91 -d {{platform.device}}
95 {{invoke_tool("symbiflow_place")}}
97 -d {{platform.device}}
104 {{invoke_tool("symbiflow_route")}}
106 -d {{platform.device}}
110 {{invoke_tool("symbiflow_write_fasm")}}
112 -d {{platform.device}}
116 {{invoke_tool("symbiflow_write_bitstream")}}
118 -d {{platform.device}}
129 def add_clock_constraint(self
, clock
, frequency
):
130 super().add_clock_constraint(clock
, frequency
)
131 clock
.attrs
["keep"] = "TRUE"
133 def create_missing_domain(self
, name
):
134 if name
== "sync" and self
.default_clk
is not None:
136 if self
.default_clk
== "sys_clk0":
139 m
.submodules
+= Instance("qlal4s3b_cell_macro",
141 m
.submodules
+= Instance("gclkbuff",
145 clk_i
= self
.request(self
.default_clk
).i
147 if self
.default_rst
is not None:
148 rst_i
= self
.request(self
.default_rst
).i
152 m
.domains
+= ClockDomain("sync")
153 m
.d
.comb
+= ClockSignal("sync").eq(clk_i
)
154 m
.submodules
.reset_sync
= ResetSynchronizer(rst_i
, domain
="sync")