build/xilinx/vivado: improve directive support
[litex.git] / litex / build / xilinx / platform.py
1 # This file is Copyright (c) 2015 Sebastien Bourdeauducq <sb@m-labs.hk>
2 # This file is Copyright (c) 2015-2018 Florent Kermarrec <florent@enjoy-digital.fr>
3 # License: BSD
4
5 import os
6
7 from litex.build.generic_platform import GenericPlatform
8 from litex.build.xilinx import common, vivado, ise
9
10
11 class XilinxPlatform(GenericPlatform):
12 bitstream_ext = ".bit"
13
14 def __init__(self, *args, toolchain="ise", **kwargs):
15 GenericPlatform.__init__(self, *args, **kwargs)
16 self.edifs = set()
17 self.ips = set()
18 if toolchain == "ise":
19 self.toolchain = ise.XilinxISEToolchain()
20 elif toolchain == "vivado":
21 self.toolchain = vivado.XilinxVivadoToolchain()
22 else:
23 raise ValueError("Unknown toolchain")
24
25 def add_edif(self, filename):
26 self.edifs.add((os.path.abspath(filename)))
27
28 def add_ip(self, filename):
29 self.ips.add((os.path.abspath(filename)))
30
31 def get_verilog(self, *args, special_overrides=dict(), **kwargs):
32 so = dict(common.xilinx_special_overrides)
33 if self.device[:3] == "xc6":
34 so.update(common.xilinx_s6_special_overrides)
35 if self.device[:3] == "xc7":
36 so.update(common.xilinx_s7_special_overrides)
37 if self.device[:4] == "xcku":
38 so.update(common.xilinx_ku_special_overrides)
39 so.update(special_overrides)
40 return GenericPlatform.get_verilog(self, *args,
41 special_overrides=so, attr_translate=self.toolchain.attr_translate, **kwargs)
42
43 def get_edif(self, fragment, **kwargs):
44 return GenericPlatform.get_edif(self, fragment, "UNISIMS", "Xilinx", self.device, **kwargs)
45
46 def build(self, *args, **kwargs):
47 return self.toolchain.build(self, *args, **kwargs)
48
49 def add_period_constraint(self, clk, period):
50 if hasattr(clk, "p"):
51 clk = clk.p
52 self.toolchain.add_period_constraint(self, clk, period)
53
54 def add_false_path_constraint(self, from_, to):
55 if hasattr(from_, "p"):
56 from_ = from_.p
57 if hasattr(to, "p"):
58 to = to.p
59 self.toolchain.add_false_path_constraint(self, from_, to)