// SPDX-License-Identifier: Apache-2.0
WHITESPACE = _{ " " | "\t" | "\n" | "\r" }
identifier = @{ (ASCII_ALPHANUMERIC | "_")+ }
full_identifier = @{ (ASCII_ALPHANUMERIC | "_" | ":")+ }
number = @{ ASCII_DIGIT+ }
range = { number ~ ":" ~ number }
packed_dimension = { "[" ~ range ~ "]" }
packed_dimensions = { packed_dimension* }
unpacked_dimensions = { packed_dimension* }
dimensions = { packed_dimensions ~ ( "$" ~ unpacked_dimensions )? }
signed_modifier = { "signed" }
logic_type = { ( "logic" | "reg" | "bit" ) ~ signed_modifier? ~ dimensions }
struct_type = { "struct" ~ ("packed")? ~ "{" ~ field_list ~ "}" ~ full_identifier ~ dimensions }
enum_type = { "enum" ~ "{" ~ variant_list ~ "}" ~ full_identifier ~ dimensions }
allowed_type = { logic_type | struct_type | enum_type }
field = { allowed_type ~ identifier }
field_list = { field ~ (";" ~ field)* ~ (";")? }
negative_sign = { "-" }
verilog_decimal = { negative_sign? ~ number ~ "'" ~ ("s")? ~ "d" ~ number }
variant = { identifier ~ "=" ~ verilog_decimal }
variant_list = { variant ~ ("," ~ variant)* ~ (";")? }
top = { allowed_type ~ EOI }