From e0e296349a02a453e5c6898ecb0f1bf4b3076f40 Mon Sep 17 00:00:00 2001 From: Zachary Snow Date: Tue, 1 Jun 2021 13:09:36 -0400 Subject: [PATCH] check for unknown named bindings --- src/Convert/ResolveBindings.hs | 8 ++++++++ test/error/binding_not_found_class.sv | 10 ++++++++++ test/error/binding_not_found_param.sv | 8 ++++++++ test/error/binding_not_found_port.sv | 8 ++++++++ 4 files changed, 34 insertions(+) create mode 100644 test/error/binding_not_found_class.sv create mode 100644 test/error/binding_not_found_param.sv create mode 100644 test/error/binding_not_found_port.sv diff --git a/src/Convert/ResolveBindings.hs b/src/Convert/ResolveBindings.hs index b95b3b8..16e2d14 100644 --- a/src/Convert/ResolveBindings.hs +++ b/src/Convert/ResolveBindings.hs @@ -17,6 +17,7 @@ module Convert.ResolveBindings ) where import Control.Monad.Writer.Strict +import Data.List (intercalate, (\\)) import qualified Data.Map.Strict as Map import Convert.ExprUtils (simplify) @@ -121,5 +122,12 @@ resolveBindings location available bindings = error $ "too many bindings specified for " ++ location else if null $ fst $ head bindings then zip available $ map snd bindings + else if not $ null unknowns then + error $ "unknown binding" ++ unknownsPlural ++ " " + ++ unknownsStr ++ " specified for " ++ location else bindings + where + unknowns = map fst bindings \\ available + unknownsPlural = if length unknowns == 1 then "" else "s" + unknownsStr = intercalate ", " $ map show unknowns diff --git a/test/error/binding_not_found_class.sv b/test/error/binding_not_found_class.sv new file mode 100644 index 0000000..c3e2379 --- /dev/null +++ b/test/error/binding_not_found_class.sv @@ -0,0 +1,10 @@ +// pattern: unknown binding "R" specified for parameters in class specialization of "example" +class example #( + parameter P = 1, + parameter Q = 1 +); + typedef logic [P * Q:0] T; +endclass +module top; + example#(.P(1), .R(2))::T x; +endmodule diff --git a/test/error/binding_not_found_param.sv b/test/error/binding_not_found_param.sv new file mode 100644 index 0000000..6fd2c47 --- /dev/null +++ b/test/error/binding_not_found_param.sv @@ -0,0 +1,8 @@ +// pattern: unknown binding "R" specified for parameter overrides in instance "e" of "example" +module example; + parameter P = 1; + parameter Q = 1; +endmodule +module top; + example #(.P(1), .R(2)) e(); +endmodule diff --git a/test/error/binding_not_found_port.sv b/test/error/binding_not_found_port.sv new file mode 100644 index 0000000..0110a0e --- /dev/null +++ b/test/error/binding_not_found_port.sv @@ -0,0 +1,8 @@ +// pattern: unknown bindings "w", "z" specified for port connections in instance "e" of "example" +module example( + input x, y +); +endmodule +module top; + example e(.w(1), .z(1'b0)); +endmodule