Skip to content

Commit fe1c453

Browse files
jordenssbourdeauducq
authored andcommittedJul 28, 2014
mibuild.xilinx_vivado: support settingsXX.sh
* in the process refactor the version search, the architecture bit width detection, the settings search and all also for xilinx_ise * use distutils.version.StrictVersion
1 parent 44c6e52 commit fe1c453

File tree

4 files changed

+55
-29
lines changed

4 files changed

+55
-29
lines changed
 

‎mibuild/tools.py

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import os
1+
import os, struct
2+
from distutils.version import StrictVersion
23

34
def mkdir_noerror(d):
45
try:
@@ -21,3 +22,16 @@ def write_to_file(filename, contents, force_unix=False):
2122
f = open(filename, "w", newline=newline)
2223
f.write(contents)
2324
f.close()
25+
26+
def arch_bits():
27+
return struct.calcsize("P")*8
28+
29+
def versions(path):
30+
for n in os.listdir(path):
31+
full = os.path.join(path, n)
32+
if not os.path.isdir(full):
33+
continue
34+
try:
35+
yield StrictVersion(n)
36+
except ValueError:
37+
continue

‎mibuild/xilinx_ise.py

+7-21
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
1-
import os, struct, subprocess, sys
2-
from decimal import Decimal
1+
import os, subprocess, sys
32

43
from migen.fhdl.std import *
54
from migen.fhdl.specials import SynthesisDirective
65
from migen.genlib.cdc import *
76
from migen.fhdl.structure import _Fragment
87

98
from mibuild.generic_platform import *
10-
from mibuild import tools
9+
from mibuild import tools, xilinx_tools
1110

1211
def _format_constraint(c):
1312
if isinstance(c, Pins):
@@ -89,34 +88,21 @@ def _run_yosys(device, sources, vincpaths, build_name):
8988
if r != 0:
9089
raise OSError("Subprocess failed")
9190

92-
def _is_valid_version(path, v):
93-
try:
94-
Decimal(v)
95-
return os.path.isdir(os.path.join(path, v))
96-
except:
97-
return False
98-
9991
def _run_ise(build_name, ise_path, source, mode, ngdbuild_opt,
100-
bitgen_opt, ise_commands, map_opt, par_opt):
92+
bitgen_opt, ise_commands, map_opt, par_opt, ver=None):
10193
if sys.platform == "win32" or sys.platform == "cygwin":
10294
source = False
10395
build_script_contents = "# Autogenerated by mibuild\nset -e\n"
10496
if source:
105-
vers = [ver for ver in os.listdir(ise_path) if _is_valid_version(ise_path, ver)]
106-
tools_version = max(vers)
107-
bits = struct.calcsize("P")*8
108-
109-
xilinx_settings_file = os.path.join(ise_path, tools_version, "ISE_DS", "settings{0}.sh".format(bits))
110-
if not os.path.exists(xilinx_settings_file) and bits == 64:
111-
# if we are on 64-bit system but the toolchain isn't, try the 32-bit env.
112-
xilinx_settings_file = os.path.join(ise_path, tools_version, "ISE_DS", "settings32.sh")
113-
build_script_contents += "source " + xilinx_settings_file + "\n"
97+
settings = xilinx_tools.settings(ise_path, ver, "ISE_DS")
98+
build_script_contents += "source " + settings + "\n"
11499
if mode == "edif":
115100
ext = "edif"
116101
else:
117102
ext = "ngc"
118103
build_script_contents += """
119-
xst -ifn {build_name}.xst"""
104+
xst -ifn {build_name}.xst
105+
"""
120106

121107
build_script_contents += """
122108
ngdbuild {ngdbuild_opt} -uc {build_name}.ucf {build_name}.{ext} {build_name}.ngd

‎mibuild/xilinx_tools.py

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

‎mibuild/xilinx_vivado.py

+6-7
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from migen.fhdl.structure import _Fragment
88

99
from mibuild.generic_platform import *
10-
from mibuild import tools
10+
from mibuild import tools, xilinx_tools
1111

1212
def _format_constraint(c):
1313
if isinstance(c, Pins):
@@ -56,15 +56,14 @@ def _build_files(device, sources, vincpaths, build_name):
5656
tcl_contents += "quit\n"
5757
tools.write_to_file(build_name + ".tcl", tcl_contents)
5858

59-
def _run_vivado(build_name, vivado_path, source):
59+
def _run_vivado(build_name, vivado_path, source, ver=None):
6060
if sys.platform == "win32" or sys.platform == "cygwin":
6161
source = False
6262
build_script_contents = "# Autogenerated by mibuild\nset -e\n"
6363
if source:
64-
raise NotImplementedError
65-
build_script_contents += """
66-
vivado -mode tcl -source {build_name}.tcl
67-
""".format(build_name=build_name)
64+
settings = xilinx_tools.settings(vivado_path, ver)
65+
build_script_contents += "source " + settings + "\n"
66+
build_script_contents += "vivado -mode tcl -source " + build_name + ".tcl\n"
6867
build_script_file = "build_" + build_name + ".sh"
6968
tools.write_to_file(build_script_file, build_script_contents, force_unix=True)
7069

@@ -80,7 +79,7 @@ def get_verilog(self, *args, special_overrides=dict(), **kwargs):
8079
return GenericPlatform.get_verilog(self, *args, special_overrides=so, **kwargs)
8180

8281
def build(self, fragment, build_dir="build", build_name="top",
83-
vivado_path="/opt/Xilinx", source=True, run=True):
82+
vivado_path="/opt/Xilinx/Vivado", source=True, run=True):
8483
tools.mkdir_noerror(build_dir)
8584
os.chdir(build_dir)
8685

0 commit comments

Comments
 (0)
Please sign in to comment.