Skip to content

Commit 4d38232

Browse files
committedAug 6, 2014
mibuild/xilinx: share more code between ISE and Vivado, use special overrides with Vivado, merge xilinx_tools into xilinx_common
1 parent 8a7afff commit 4d38232

File tree

4 files changed

+70
-73
lines changed

4 files changed

+70
-73
lines changed
 

‎mibuild/xilinx_common.py

+63
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,34 @@
1+
import os
2+
from distutils.version import StrictVersion
3+
14
from migen.fhdl.std import *
5+
from migen.fhdl.specials import SynthesisDirective
6+
from migen.genlib.cdc import *
7+
from mibuild.generic_platform import GenericPlatform
8+
from mibuild import tools
9+
10+
def settings(path, ver=None, sub=None):
11+
vers = list(tools.versions(path))
12+
if ver is None:
13+
ver = max(vers)
14+
else:
15+
ver = StrictVersion(ver)
16+
assert ver in vers
17+
18+
full = os.path.join(path, str(ver))
19+
if sub:
20+
full = os.path.join(full, sub)
21+
22+
search = [64, 32]
23+
if tools.arch_bits() == 32:
24+
search.reverse()
25+
26+
for b in search:
27+
settings = os.path.join(full, "settings{0}.sh".format(b))
28+
if os.path.exists(settings):
29+
return settings
30+
31+
raise ValueError("no settings file found")
232

333
class CRG_DS(Module):
434
def __init__(self, platform, clk_name, rst_name, rst_invert=False):
@@ -16,3 +46,36 @@ def __init__(self, platform, clk_name, rst_name, rst_invert=False):
1646
else:
1747
self.comb += self.cd_sys.rst.eq(platform.request(rst_name))
1848

49+
class XilinxNoRetimingImpl(Module):
50+
def __init__(self, reg):
51+
self.specials += SynthesisDirective("attribute register_balancing of {r} is no", r=reg)
52+
53+
class XilinxNoRetiming:
54+
@staticmethod
55+
def lower(dr):
56+
return XilinxNoRetimingImpl(dr.reg)
57+
58+
class XilinxMultiRegImpl(MultiRegImpl):
59+
def __init__(self, *args, **kwargs):
60+
MultiRegImpl.__init__(self, *args, **kwargs)
61+
self.specials += [SynthesisDirective("attribute shreg_extract of {r} is no", r=r)
62+
for r in self.regs]
63+
64+
class XilinxMultiReg:
65+
@staticmethod
66+
def lower(dr):
67+
return XilinxMultiRegImpl(dr.i, dr.o, dr.odomain, dr.n)
68+
69+
class XilinxGenericPlatform(GenericPlatform):
70+
bitstream_ext = ".bit"
71+
72+
def get_verilog(self, *args, special_overrides=dict(), **kwargs):
73+
so = {
74+
NoRetiming: XilinxNoRetiming,
75+
MultiReg: XilinxMultiReg
76+
}
77+
so.update(special_overrides)
78+
return GenericPlatform.get_verilog(self, *args, special_overrides=so, **kwargs)
79+
80+
def get_edif(self, fragment, **kwargs):
81+
return GenericPlatform.get_edif(self, fragment, "UNISIMS", "Xilinx", self.device, **kwargs)

‎mibuild/xilinx_ise.py

+3-36
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
11
import os, subprocess, sys
22

33
from migen.fhdl.std import *
4-
from migen.fhdl.specials import SynthesisDirective
5-
from migen.genlib.cdc import *
64
from migen.fhdl.structure import _Fragment
75

86
from mibuild.generic_platform import *
9-
from mibuild import tools, xilinx_tools
7+
from mibuild import tools, xilinx_common
108

119
def _format_constraint(c):
1210
if isinstance(c, Pins):
@@ -94,7 +92,7 @@ def _run_ise(build_name, ise_path, source, mode, ngdbuild_opt,
9492
source = False
9593
build_script_contents = "# Autogenerated by mibuild\nset -e\n"
9694
if source:
97-
settings = xilinx_tools.settings(ise_path, ver, "ISE_DS")
95+
settings = xilinx_common.settings(ise_path, ver, "ISE_DS")
9896
build_script_contents += "source " + settings + "\n"
9997
if mode == "edif":
10098
ext = "edif"
@@ -121,28 +119,7 @@ def _run_ise(build_name, ise_path, source, mode, ngdbuild_opt,
121119
if r != 0:
122120
raise OSError("Subprocess failed")
123121

124-
class XilinxNoRetimingImpl(Module):
125-
def __init__(self, reg):
126-
self.specials += SynthesisDirective("attribute register_balancing of {r} is no", r=reg)
127-
128-
class XilinxNoRetiming:
129-
@staticmethod
130-
def lower(dr):
131-
return XilinxNoRetimingImpl(dr.reg)
132-
133-
class XilinxMultiRegImpl(MultiRegImpl):
134-
def __init__(self, *args, **kwargs):
135-
MultiRegImpl.__init__(self, *args, **kwargs)
136-
self.specials += [SynthesisDirective("attribute shreg_extract of {r} is no", r=r)
137-
for r in self.regs]
138-
139-
class XilinxMultiReg:
140-
@staticmethod
141-
def lower(dr):
142-
return XilinxMultiRegImpl(dr.i, dr.o, dr.odomain, dr.n)
143-
144-
class XilinxISEPlatform(GenericPlatform):
145-
bitstream_ext = ".bit"
122+
class XilinxISEPlatform(xilinx_common.XilinxGenericPlatform):
146123
xst_opt = """-ifmt MIXED
147124
-opt_mode SPEED
148125
-register_balancing yes"""
@@ -151,16 +128,6 @@ class XilinxISEPlatform(GenericPlatform):
151128
ngdbuild_opt = ""
152129
bitgen_opt = "-g LCK_cycle:6 -g Binary:Yes -w"
153130
ise_commands = ""
154-
def get_verilog(self, *args, special_overrides=dict(), **kwargs):
155-
so = {
156-
NoRetiming: XilinxNoRetiming,
157-
MultiReg: XilinxMultiReg
158-
}
159-
so.update(special_overrides)
160-
return GenericPlatform.get_verilog(self, *args, special_overrides=so, **kwargs)
161-
162-
def get_edif(self, fragment, **kwargs):
163-
return GenericPlatform.get_edif(self, fragment, "UNISIMS", "Xilinx", self.device, **kwargs)
164131

165132
def build(self, fragment, build_dir="build", build_name="top",
166133
ise_path="/opt/Xilinx", source=True, run=True, mode="xst"):

‎mibuild/xilinx_tools.py

-27
This file was deleted.

‎mibuild/xilinx_vivado.py

+4-10
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
from migen.fhdl.std import *
77
from migen.fhdl.structure import _Fragment
8-
98
from mibuild.generic_platform import *
10-
from mibuild import tools, xilinx_tools
9+
10+
from mibuild import tools, xilinx_common
1111

1212
def _format_constraint(c):
1313
if isinstance(c, Pins):
@@ -61,7 +61,7 @@ def _run_vivado(build_name, vivado_path, source, ver=None):
6161
source = False
6262
build_script_contents = "# Autogenerated by mibuild\nset -e\n"
6363
if source:
64-
settings = xilinx_tools.settings(vivado_path, ver)
64+
settings = xilinx_common.settings(vivado_path, ver)
6565
build_script_contents += "source " + settings + "\n"
6666
build_script_contents += "vivado -mode tcl -source " + build_name + ".tcl\n"
6767
build_script_file = "build_" + build_name + ".sh"
@@ -71,13 +71,7 @@ def _run_vivado(build_name, vivado_path, source, ver=None):
7171
if r != 0:
7272
raise OSError("Subprocess failed")
7373

74-
class XilinxVivadoPlatform(GenericPlatform):
75-
bitstream_ext = ".bit"
76-
def get_verilog(self, *args, special_overrides=dict(), **kwargs):
77-
so = {}
78-
so.update(special_overrides)
79-
return GenericPlatform.get_verilog(self, *args, special_overrides=so, **kwargs)
80-
74+
class XilinxVivadoPlatform(xilinx_common.XilinxGenericPlatform):
8175
def build(self, fragment, build_dir="build", build_name="top",
8276
vivado_path="/opt/Xilinx/Vivado", source=True, run=True):
8377
tools.mkdir_noerror(build_dir)

0 commit comments

Comments
 (0)
Please sign in to comment.