From 499603a37a5f425248fee64dfcc5138f94ae9d33 Mon Sep 17 00:00:00 2001 From: whitequark Date: Tue, 14 Apr 2020 06:17:16 +0000 Subject: [PATCH] buil.plat: enable strict undefined behavior in Jinja2. By default, if an operation produces an undefined value (a Jinja2 concept that corresponds to Python's KeyError, AttributeError, etc) then this value may be printed in a template, which is a nop. This behavior can hide bugs. This commit changes the Jinja2 behavior to raise an error instead of producing an undefined value in all cases. (We produce undefined values deliberately in a few places. Those are unaffected; it is OK to use several kinds of undefined values in one Jinja2 environment.) Fixes #337. --- nmigen/build/plat.py | 3 ++- nmigen/vendor/lattice_ice40.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/nmigen/build/plat.py b/nmigen/build/plat.py index 291d90c..d9f2ab2 100644 --- a/nmigen/build/plat.py +++ b/nmigen/build/plat.py @@ -383,7 +383,8 @@ class TemplatedPlatform(Platform): def render(source, origin, syntax=None): try: source = textwrap.dedent(source).strip() - compiled = jinja2.Template(source, trim_blocks=True, lstrip_blocks=True) + compiled = jinja2.Template(source, + trim_blocks=True, lstrip_blocks=True, undefined=jinja2.StrictUndefined) compiled.environment.filters["options"] = options compiled.environment.filters["hierarchy"] = hierarchy except jinja2.TemplateSyntaxError as e: diff --git a/nmigen/vendor/lattice_ice40.py b/nmigen/vendor/lattice_ice40.py index 56da2e8..94dd02a 100644 --- a/nmigen/vendor/lattice_ice40.py +++ b/nmigen/vendor/lattice_ice40.py @@ -155,7 +155,8 @@ class LatticeICE40Platform(TemplatedPlatform): --log {{name}}.tim {{platform._nextpnr_device_options[platform.device]}} --package - {{platform.package|lower}}{{platform._nextpnr_package_options[platform.device]}} + {{platform.package|lower}}{{platform._nextpnr_package_options[platform.device]| + default("")}} --json {{name}}.json --pcf {{name}}.pcf --asc {{name}}.asc -- 2.30.2