From d0b8daa005c332b97e3014576b4e6aabfaeccef1 Mon Sep 17 00:00:00 2001 From: Florent Kermarrec Date: Tue, 5 May 2020 11:23:46 +0200 Subject: [PATCH] build/platform: allow doing a loose lookup_request (return None instead of ConstraintError) and allow subname in lookup_request. In the platforms, insead of doing: self.lookup_request("eth_clocks").rx we can now do: self.lookup_request("eth_clocks:rx") This allows some try/except simplifications on constraints. --- litex/build/altera/platform.py | 1 + litex/build/generic_platform.py | 14 +++++++++++--- litex/build/lattice/platform.py | 1 + litex/build/microsemi/platform.py | 1 + litex/build/xilinx/platform.py | 1 + 5 files changed, 15 insertions(+), 3 deletions(-) diff --git a/litex/build/altera/platform.py b/litex/build/altera/platform.py index a95dcf4b..2f03fc72 100644 --- a/litex/build/altera/platform.py +++ b/litex/build/altera/platform.py @@ -33,6 +33,7 @@ class AlteraPlatform(GenericPlatform): return self.toolchain.build(self, *args, **kwargs) def add_period_constraint(self, clk, period): + if clk is None: return if hasattr(clk, "p"): clk = clk.p self.toolchain.add_period_constraint(self, clk, period) diff --git a/litex/build/generic_platform.py b/litex/build/generic_platform.py index d540cc38..7c489efe 100644 --- a/litex/build/generic_platform.py +++ b/litex/build/generic_platform.py @@ -205,13 +205,21 @@ class ConstraintManager: self.matched.append((resource, obj)) return obj - def lookup_request(self, name, number=None): + def lookup_request(self, name, number=None, loose=False): + subname = None + if ":" in name: name, subname = name.split(":") for resource, obj in self.matched: if resource[0] == name and (number is None or resource[1] == number): - return obj + if subname is not None: + return getattr(obj, subname) + else: + return obj - raise ConstraintError("Resource not found: {}:{}".format(name, number)) + if loose: + return None + else: + raise ConstraintError("Resource not found: {}:{}".format(name, number)) def add_platform_command(self, command, **signals): self.platform_commands.append((command, signals)) diff --git a/litex/build/lattice/platform.py b/litex/build/lattice/platform.py index 71ff2a65..7380b45e 100644 --- a/litex/build/lattice/platform.py +++ b/litex/build/lattice/platform.py @@ -34,6 +34,7 @@ class LatticePlatform(GenericPlatform): return self.toolchain.build(self, *args, **kwargs) def add_period_constraint(self, clk, period): + if clk is None: return if hasattr(clk, "p"): clk = clk.p self.toolchain.add_period_constraint(self, clk, period) diff --git a/litex/build/microsemi/platform.py b/litex/build/microsemi/platform.py index 65d2c996..c8f13bd8 100644 --- a/litex/build/microsemi/platform.py +++ b/litex/build/microsemi/platform.py @@ -28,6 +28,7 @@ class MicrosemiPlatform(GenericPlatform): return self.toolchain.build(self, *args, **kwargs) def add_period_constraint(self, clk, period): + if clk is None: return clk.attr.add("keep") if hasattr(clk, "p"): clk = clk.p diff --git a/litex/build/xilinx/platform.py b/litex/build/xilinx/platform.py index cf7bbeb5..d5e3d8f8 100644 --- a/litex/build/xilinx/platform.py +++ b/litex/build/xilinx/platform.py @@ -48,6 +48,7 @@ class XilinxPlatform(GenericPlatform): return self.toolchain.build(self, *args, **kwargs) def add_period_constraint(self, clk, period): + if clk is None: return if hasattr(clk, "p"): clk = clk.p self.toolchain.add_period_constraint(self, clk, period) -- 2.30.2