Allow attributes on individual switch cases in RTLIL.
authorwhitequark <whitequark@whitequark.org>
Mon, 8 Jul 2019 11:34:58 +0000 (11:34 +0000)
committerwhitequark <whitequark@whitequark.org>
Mon, 8 Jul 2019 11:34:58 +0000 (11:34 +0000)
commit93bc5affd3fc635dafec3a37bf4c5b94c252036f
tree0901b0abea7fed10e3fc1f8ec5b37e88e26b6664
parent030483ffb909ab38e10d437d09ec922cb0ad2ce8
Allow attributes on individual switch cases in RTLIL.

The parser changes are slightly awkward. Consider the following IL:

    process $0
      <point 1>
      switch \foo
        <point 2>
        case 1'1
          assign \bar \baz
          <point 3>
          ...
        case
      end
    end

Before this commit, attributes are valid in <point 1>, and <point 3>
iff it is immediately followed by a `switch`. (They are essentially
attached to the switch.) But, after this commit, and because switch
cases do not have an ending delimiter, <point 3> becomes ambiguous:
the attribute could attach to either the following `case`, or to
the following `switch`. This isn't expressible in LALR(1) and results
in a reduce/reduce conflict.

To address this, attributes inside processes are now valid anywhere
inside the process: in <point 1> and <point 3> a part of case body,
and in <point 2> as a separate rule. As a consequence, attributes
can now precede `assign`s, which is made illegal in the same way it
is illegal to attach attributes to `connect`.

Attributes are tracked separately from the parser state, so this
does not affect collection of attributes at all, other than allowing
them on `case`s. The grammar change serves purely to allow attributes
in more syntactic places.
backends/ilang/ilang_backend.cc
frontends/ilang/ilang_parser.y
kernel/rtlil.h