mirror of https://github.com/zachjs/sv2v.git
support for enumerated type ranges
This commit is contained in:
parent
03a913ad65
commit
4c3dcf5219
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
* Added support for excluding the conversion of unbased unsized literals (e.g.,
|
* Added support for excluding the conversion of unbased unsized literals (e.g.,
|
||||||
`'1`, `'x`) via `--exclude UnbasedUniszed`
|
`'1`, `'x`) via `--exclude UnbasedUniszed`
|
||||||
|
* Added support for enumerated type ranges (e.g., `enum { X[3:5] }`)
|
||||||
|
|
||||||
### Other Enhancements
|
### Other Enhancements
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@
|
||||||
|
|
||||||
module Language.SystemVerilog.AST.Type
|
module Language.SystemVerilog.AST.Type
|
||||||
( Identifier
|
( Identifier
|
||||||
|
, EnumItem
|
||||||
, Field
|
, Field
|
||||||
, Type (..)
|
, Type (..)
|
||||||
, Signing (..)
|
, Signing (..)
|
||||||
|
|
@ -33,7 +34,7 @@ import Language.SystemVerilog.AST.ShowHelp
|
||||||
|
|
||||||
type Identifier = String
|
type Identifier = String
|
||||||
|
|
||||||
type Item = (Identifier, Expr)
|
type EnumItem = (Identifier, Expr)
|
||||||
type Field = (Type, Identifier)
|
type Field = (Type, Identifier)
|
||||||
|
|
||||||
data Type
|
data Type
|
||||||
|
|
@ -44,7 +45,7 @@ data Type
|
||||||
| Alias Identifier [Range]
|
| Alias Identifier [Range]
|
||||||
| PSAlias Identifier Identifier [Range]
|
| PSAlias Identifier Identifier [Range]
|
||||||
| CSAlias Identifier [ParamBinding] Identifier [Range]
|
| CSAlias Identifier [ParamBinding] Identifier [Range]
|
||||||
| Enum Type [Item] [Range]
|
| Enum Type [EnumItem] [Range]
|
||||||
| Struct Packing [Field] [Range]
|
| Struct Packing [Field] [Range]
|
||||||
| Union Packing [Field] [Range]
|
| Union Packing [Field] [Range]
|
||||||
| InterfaceT Identifier Identifier [Range]
|
| InterfaceT Identifier Identifier [Range]
|
||||||
|
|
@ -66,7 +67,7 @@ instance Show Type where
|
||||||
show (Enum t vals r) = printf "enum %s{%s}%s" tStr (commas $ map showVal vals) (showRanges r)
|
show (Enum t vals r) = printf "enum %s{%s}%s" tStr (commas $ map showVal vals) (showRanges r)
|
||||||
where
|
where
|
||||||
tStr = showPad t
|
tStr = showPad t
|
||||||
showVal :: (Identifier, Expr) -> String
|
showVal :: EnumItem -> String
|
||||||
showVal (x, e) = x ++ (showAssignment e)
|
showVal (x, e) = x ++ (showAssignment e)
|
||||||
show (Struct p items r) = printf "struct %s{\n%s\n}%s" (showPad p) (showFields items) (showRanges r)
|
show (Struct p items r) = printf "struct %s{\n%s\n}%s" (showPad p) (showFields items) (showRanges r)
|
||||||
show (Union p items r) = printf "union %s{\n%s\n}%s" (showPad p) (showFields items) (showRanges r)
|
show (Union p items r) = printf "union %s{\n%s\n}%s" (showPad p) (showFields items) (showRanges r)
|
||||||
|
|
|
||||||
|
|
@ -519,8 +519,17 @@ NonIntegerTypeP :: { (Position, NonIntegerType) }
|
||||||
| "string" { withPos $1 TString }
|
| "string" { withPos $1 TString }
|
||||||
| "event" { withPos $1 TEvent }
|
| "event" { withPos $1 TEvent }
|
||||||
|
|
||||||
EnumItems :: { [(Identifier, Expr)] }
|
EnumItems :: { [EnumItem] }
|
||||||
: VariablePortIdentifiers { $1 }
|
: EnumItem { $1 }
|
||||||
|
| EnumItem "," EnumItems { $1 ++ $3 }
|
||||||
|
EnumItem :: { [EnumItem] }
|
||||||
|
: Identifier OptAsgn { [($1, $2)] }
|
||||||
|
| IdentifierP IntegralDimension OptAsgn {% makeEnumItems $1 $2 $3 }
|
||||||
|
IntegralDimension :: { (Integer, Integer) }
|
||||||
|
: "[" IntegralNumber "]" { ( 0, $2 - 1) }
|
||||||
|
| "[" IntegralNumber ":" IntegralNumber "]" { ($2, $4) }
|
||||||
|
IntegralNumber :: { Integer }
|
||||||
|
: number {% readIntegralNumber (tokenPosition $1) (tokenString $1) }
|
||||||
|
|
||||||
StructItems :: { [(Type, Identifier)] }
|
StructItems :: { [(Type, Identifier)] }
|
||||||
: StructItem { $1 }
|
: StructItem { $1 }
|
||||||
|
|
@ -672,12 +681,6 @@ ParamDeclToken :: { [DeclToken] }
|
||||||
| "type" IdentifierP { [DTTypeDecl (tokenPosition $1), uncurry DTIdent $2] }
|
| "type" IdentifierP { [DTTypeDecl (tokenPosition $1), uncurry DTIdent $2] }
|
||||||
| ParameterDeclKW { [uncurry DTParamKW $1] }
|
| ParameterDeclKW { [uncurry DTParamKW $1] }
|
||||||
|
|
||||||
VariablePortIdentifiers :: { [(Identifier, Expr)] }
|
|
||||||
: VariablePortIdentifier { [$1] }
|
|
||||||
| VariablePortIdentifiers "," VariablePortIdentifier { $1 ++ [$3] }
|
|
||||||
VariablePortIdentifier :: { (Identifier, Expr) }
|
|
||||||
: Identifier OptAsgn { ($1,$2) }
|
|
||||||
|
|
||||||
Direction :: { Direction }
|
Direction :: { Direction }
|
||||||
: DirectionP { snd $1 }
|
: DirectionP { snd $1 }
|
||||||
DirectionP :: { (Position, Direction) }
|
DirectionP :: { (Position, Direction) }
|
||||||
|
|
@ -1714,4 +1717,29 @@ expectZeroDelay tok a = do
|
||||||
_ -> parseError pos $ "expected 0 after #, but found " ++ str
|
_ -> parseError pos $ "expected 0 after #, but found " ++ str
|
||||||
where Token { tokenString = str, tokenPosition = pos } = tok
|
where Token { tokenString = str, tokenPosition = pos } = tok
|
||||||
|
|
||||||
|
readIntegralNumber :: Position -> String -> ParseState Integer
|
||||||
|
readIntegralNumber pos str = do
|
||||||
|
num <- readNumber pos str
|
||||||
|
case numberToInteger num of
|
||||||
|
Nothing ->
|
||||||
|
parseError pos $ "expected an integral number, but found " ++ str
|
||||||
|
Just integer | integer < 0 ->
|
||||||
|
parseError pos $ "expected a non-negative number, but found " ++ str
|
||||||
|
Just integer ->
|
||||||
|
return integer
|
||||||
|
|
||||||
|
makeEnumItems :: (Position, Identifier) -> (Integer, Integer) -> Expr
|
||||||
|
-> ParseState [EnumItem]
|
||||||
|
makeEnumItems (pos, _) (0, -1) _ =
|
||||||
|
parseError pos "expected a positive number, but found zero"
|
||||||
|
makeEnumItems (_, root) (l, r) base =
|
||||||
|
return $ (name, base) : map (, Nil) names
|
||||||
|
where
|
||||||
|
name : names =
|
||||||
|
map (root ++) $
|
||||||
|
map show $
|
||||||
|
if l >= r
|
||||||
|
then reverse [r..l]
|
||||||
|
else [l..r]
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,6 +43,18 @@ typedef enum int {
|
||||||
Z_1, Z_2, Z_3
|
Z_1, Z_2, Z_3
|
||||||
} EnumZ;
|
} EnumZ;
|
||||||
|
|
||||||
|
typedef enum int {
|
||||||
|
K_A,
|
||||||
|
K_B = 10,
|
||||||
|
K_C[3],
|
||||||
|
K_D[3] = 20,
|
||||||
|
K_E[4:6],
|
||||||
|
K_F[4:6] = 30,
|
||||||
|
K_G[6:4],
|
||||||
|
K_H[6:4] = 40,
|
||||||
|
K_I[3:3] = 50
|
||||||
|
} EnumK;
|
||||||
|
|
||||||
`define PRINT(name, val) \
|
`define PRINT(name, val) \
|
||||||
dummy``name = name``_``val; \
|
dummy``name = name``_``val; \
|
||||||
$display(`"name %h %h %0d %0d`", \
|
$display(`"name %h %h %0d %0d`", \
|
||||||
|
|
@ -58,6 +70,7 @@ module top;
|
||||||
EnumG dummyG;
|
EnumG dummyG;
|
||||||
EnumH dummyH;
|
EnumH dummyH;
|
||||||
EnumI dummyI;
|
EnumI dummyI;
|
||||||
|
EnumK dummyK;
|
||||||
|
|
||||||
initial begin
|
initial begin
|
||||||
|
|
||||||
|
|
@ -96,6 +109,28 @@ module top;
|
||||||
`PRINT(I, 1)
|
`PRINT(I, 1)
|
||||||
`PRINT(I, 2)
|
`PRINT(I, 2)
|
||||||
|
|
||||||
|
`PRINT(K, A)
|
||||||
|
`PRINT(K, B)
|
||||||
|
`PRINT(K, C0)
|
||||||
|
`PRINT(K, C1)
|
||||||
|
`PRINT(K, C2)
|
||||||
|
`PRINT(K, D0)
|
||||||
|
`PRINT(K, D1)
|
||||||
|
`PRINT(K, D2)
|
||||||
|
`PRINT(K, E4)
|
||||||
|
`PRINT(K, E5)
|
||||||
|
`PRINT(K, E6)
|
||||||
|
`PRINT(K, F4)
|
||||||
|
`PRINT(K, F5)
|
||||||
|
`PRINT(K, F6)
|
||||||
|
`PRINT(K, G6)
|
||||||
|
`PRINT(K, G5)
|
||||||
|
`PRINT(K, G4)
|
||||||
|
`PRINT(K, H6)
|
||||||
|
`PRINT(K, H5)
|
||||||
|
`PRINT(K, H4)
|
||||||
|
`PRINT(K, I3)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
parameter USE_J = 1;
|
parameter USE_J = 1;
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ module top;
|
||||||
reg [0:0] dummyG;
|
reg [0:0] dummyG;
|
||||||
reg [3:0] dummyH;
|
reg [3:0] dummyH;
|
||||||
reg [31:0] dummyI;
|
reg [31:0] dummyI;
|
||||||
|
reg [31:0] dummyK;
|
||||||
|
|
||||||
initial begin
|
initial begin
|
||||||
|
|
||||||
|
|
@ -52,6 +53,28 @@ module top;
|
||||||
`PRINT(I, 'b0)
|
`PRINT(I, 'b0)
|
||||||
`PRINT(I, 'b1)
|
`PRINT(I, 'b1)
|
||||||
|
|
||||||
|
`PRINT(K, 0)
|
||||||
|
`PRINT(K, 10)
|
||||||
|
`PRINT(K, 11)
|
||||||
|
`PRINT(K, 12)
|
||||||
|
`PRINT(K, 13)
|
||||||
|
`PRINT(K, 20)
|
||||||
|
`PRINT(K, 21)
|
||||||
|
`PRINT(K, 22)
|
||||||
|
`PRINT(K, 23)
|
||||||
|
`PRINT(K, 24)
|
||||||
|
`PRINT(K, 25)
|
||||||
|
`PRINT(K, 30)
|
||||||
|
`PRINT(K, 31)
|
||||||
|
`PRINT(K, 32)
|
||||||
|
`PRINT(K, 33)
|
||||||
|
`PRINT(K, 34)
|
||||||
|
`PRINT(K, 35)
|
||||||
|
`PRINT(K, 40)
|
||||||
|
`PRINT(K, 41)
|
||||||
|
`PRINT(K, 42)
|
||||||
|
`PRINT(K, 50)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
parameter USE_J = 1;
|
parameter USE_J = 1;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
// pattern: expected a non-negative number, but found 1'sd1
|
||||||
|
module top;
|
||||||
|
enum {
|
||||||
|
A[1'sd1]
|
||||||
|
} x;
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
// pattern: expected an integral number, but found 'x
|
||||||
|
module top;
|
||||||
|
enum {
|
||||||
|
A['x]
|
||||||
|
} x;
|
||||||
|
endmodule
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
// pattern: expected a positive number, but found zero
|
||||||
|
module top;
|
||||||
|
enum {
|
||||||
|
A[0]
|
||||||
|
} x;
|
||||||
|
endmodule
|
||||||
Loading…
Reference in New Issue