Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
sv2v
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
sv2v
Commits
b0d573c5
Commit
b0d573c5
authored
Feb 17, 2019
by
Zachary Snow
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
removed BitVec exprs to preserve number formatting
parent
a3937a27
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
24 additions
and
144 deletions
+24
-144
Data/BitVec.hs
+0
-66
Language/SystemVerilog/AST.hs
+22
-54
Language/SystemVerilog/Parser/Parse.y
+2
-22
sv2v.cabal
+0
-2
No files found.
Data/BitVec.hs
deleted
100644 → 0
View file @
a3937a27
-- | Unsigned bit vectors.
module
Data.BitVec
(
BitVec
,
bitVec
,
select
,
width
,
value
)
where
import
Data.Bits
data
BitVec
=
BitVec
Int
Integer
deriving
(
Show
,
Eq
)
instance
Num
BitVec
where
BitVec
w1
v1
+
BitVec
w2
v2
=
bitVec
(
max
w1
w2
)
(
v1
+
v2
)
BitVec
w1
v1
-
BitVec
w2
v2
=
bitVec
(
max
w1
w2
)
(
v1
-
v2
)
BitVec
w1
v1
*
BitVec
w2
v2
=
bitVec
(
max
w1
w2
)
(
v1
*
v2
)
abs
=
id
signum
(
BitVec
_
v
)
=
if
v
==
0
then
bitVec
1
0
else
bitVec
1
1
fromInteger
i
=
bitVec
(
wid
i
)
i
where
wid
::
Integer
->
Int
wid
a
|
a
==
0
=
0
|
a
==
-
1
=
1
|
otherwise
=
1
+
wid
(
shiftR
a
1
)
instance
Bits
BitVec
where
BitVec
w1
v1
.&.
BitVec
w2
v2
=
bitVec
(
max
w1
w2
)
(
v1
.&.
v2
)
BitVec
w1
v1
.|.
BitVec
w2
v2
=
bitVec
(
max
w1
w2
)
(
v1
.|.
v2
)
BitVec
w1
v1
`
xor
`
BitVec
w2
v2
=
bitVec
(
max
w1
w2
)
(
v1
`
xor
`
v2
)
complement
(
BitVec
w
v
)
=
bitVec
w
$
complement
v
shift
(
BitVec
w
v
)
i
=
bitVec
w
$
shift
v
i
rotate
_
_
=
undefined
--XXX To lazy to implemented it now.
bit
i
=
fromInteger
$
bit
i
testBit
(
BitVec
_
v
)
i
=
testBit
v
i
bitSize
(
BitVec
w
_
)
=
w
bitSizeMaybe
(
BitVec
w
_
)
=
Just
w
isSigned
_
=
False
popCount
(
BitVec
_
v
)
=
popCount
v
instance
Semigroup
BitVec
where
(
<>
)
=
mappend
instance
Monoid
BitVec
where
mempty
=
BitVec
0
0
mappend
(
BitVec
w1
v1
)
(
BitVec
w2
v2
)
=
BitVec
(
w1
+
w2
)
(
shiftL
v1
w2
.|.
v2
)
-- | BitVec construction, given width and value.
bitVec
::
Int
->
Integer
->
BitVec
bitVec
w
v
=
BitVec
w'
$
v
.&.
((
2
^
fromIntegral
w'
)
-
1
)
where
w'
=
max
w
0
-- | Bit seclection. LSB is 0.
select
::
BitVec
->
(
BitVec
,
BitVec
)
->
BitVec
select
(
BitVec
_
v
)
(
msb
,
lsb
)
=
bitVec
(
fromIntegral
$
value
$
msb
-
lsb
+
1
)
$
shiftR
v
(
fromIntegral
$
value
$
lsb
)
-- | Width of a 'BitVec'.
width
::
BitVec
->
Int
width
(
BitVec
w
_
)
=
w
-- | Value of a 'BitVec'.
value
::
BitVec
->
Integer
value
(
BitVec
_
v
)
=
v
Language/SystemVerilog/AST.hs
View file @
b0d573c5
...
...
@@ -25,8 +25,6 @@ import Data.List
import
Data.Maybe
import
Text.Printf
import
Data.BitVec
type
Identifier
=
String
-- Note: Verilog allows modules to be declared with either a simple list of
...
...
@@ -96,11 +94,11 @@ type PortBinding = (Identifier, Maybe Expr)
data
Parameter
=
Parameter
(
Maybe
Range
)
Identifier
Expr
deriving
Eq
instance
Show
Parameter
where
show
(
Parameter
r
n
e
)
=
printf
"parameter %s%s = %s;"
(
showRange
r
)
n
(
show
ExprConst
e
)
show
(
Parameter
r
n
e
)
=
printf
"parameter %s%s = %s;"
(
showRange
r
)
n
(
show
e
)
data
Localparam
=
Localparam
(
Maybe
Range
)
Identifier
Expr
deriving
Eq
instance
Show
Localparam
where
show
(
Localparam
r
n
e
)
=
printf
"localparam %s%s = %s;"
(
showRange
r
)
n
(
show
ExprConst
e
)
show
(
Localparam
r
n
e
)
=
printf
"localparam %s%s = %s;"
(
showRange
r
)
n
(
show
e
)
data
IntegerV
=
IntegerV
Identifier
RangesOrAssignment
deriving
Eq
instance
Show
IntegerV
where
...
...
@@ -119,7 +117,7 @@ instance Show ModuleItem where
Assign
a
b
->
printf
"assign %s = %s;"
(
show
a
)
(
show
b
)
Instance
m
params
i
ports
|
null
params
->
printf
"%s %s %s;"
m
i
(
showPorts
show
ports
)
|
otherwise
->
printf
"%s #%s %s %s;"
m
(
showPorts
show
ExprConst
params
)
i
(
showPorts
show
ports
)
|
otherwise
->
printf
"%s #%s %s %s;"
m
(
showPorts
show
params
)
i
(
showPorts
show
ports
)
Function
t
x
i
b
->
printf
"function %s%s;
\n
%s
\n
%s
\n
endfunction"
(
showFuncRet
t
)
x
(
indent
$
unlines'
$
map
showFunctionItem
i
)
(
indent
$
show
b
)
where
showPorts
::
(
Expr
->
String
)
->
[(
Identifier
,
Maybe
Expr
)]
->
String
...
...
@@ -151,7 +149,7 @@ showRanges = concat . (map rangeToString)
showRange
::
Maybe
Range
->
String
showRange
Nothing
=
""
showRange
(
Just
(
h
,
l
))
=
printf
"[%s:%s] "
(
show
ExprConst
h
)
(
showExprConst
l
)
showRange
(
Just
(
h
,
l
))
=
printf
"[%s:%s] "
(
show
h
)
(
show
l
)
indent
::
String
->
String
indent
a
=
'
\t
'
:
f
a
...
...
@@ -166,7 +164,7 @@ unlines' = intercalate "\n"
data
Expr
=
String
String
|
Number
BitVec
|
Number
String
|
ConstBool
Bool
|
Ident
Identifier
|
IdentRange
Identifier
Range
...
...
@@ -247,43 +245,21 @@ instance Show BinOp where
Gt
->
">"
Ge
->
">="
showBitVecDefault
::
BitVec
->
String
showBitVecDefault
a
=
printf
"%d'h%x"
(
width
a
)
(
value
a
)
showBitVecConst
::
BitVec
->
String
showBitVecConst
a
=
show
$
value
a
instance
Show
Expr
where
show
=
showExpr
showBitVecDefault
showExprConst
::
Expr
->
String
showExprConst
=
showExpr
showBitVecConst
showExpr
::
(
BitVec
->
String
)
->
Expr
->
String
showExpr
bv
x
=
case
x
of
String
a
->
printf
"
\"
%s
\"
"
a
Number
a
->
bv
a
ConstBool
a
->
printf
"1'b%s"
(
if
a
then
"1"
else
"0"
)
Ident
a
->
a
IdentBit
a
b
->
printf
"%s[%s]"
a
(
showExprConst
b
)
IdentRange
a
(
b
,
c
)
->
printf
"%s[%s:%s]"
a
(
showExprConst
b
)
(
showExprConst
c
)
Repeat
a
b
->
printf
"{%s {%s}}"
(
showExprConst
a
)
(
commas
$
map
s
b
)
Concat
a
->
printf
"{%s}"
(
commas
$
map
show
a
)
ExprCall
a
->
show
a
UniOp
a
b
->
printf
"(%s %s)"
(
show
a
)
(
s
b
)
BinOp
a
b
c
->
printf
"(%s %s %s)"
(
s
b
)
(
show
a
)
(
s
c
)
Mux
a
b
c
->
printf
"(%s ? %s : %s)"
(
s
a
)
(
s
b
)
(
s
c
)
Bit
a
b
->
printf
"(%s [%d])"
(
s
a
)
b
where
s
=
showExpr
bv
instance
Num
Expr
where
(
+
)
=
BinOp
Add
(
-
)
=
BinOp
Sub
(
*
)
=
BinOp
Mul
negate
=
UniOp
USub
abs
=
undefined
signum
=
undefined
fromInteger
=
Number
.
fromInteger
instance
Show
Expr
where
show
x
=
case
x
of
String
a
->
printf
"
\"
%s
\"
"
a
Number
a
->
a
ConstBool
a
->
printf
"1'b%s"
(
if
a
then
"1"
else
"0"
)
Ident
a
->
a
IdentBit
a
b
->
printf
"%s[%s]"
a
(
show
b
)
IdentRange
a
(
b
,
c
)
->
printf
"%s[%s:%s]"
a
(
show
b
)
(
show
c
)
Repeat
a
b
->
printf
"{%s {%s}}"
(
show
a
)
(
commas
$
map
show
b
)
Concat
a
->
printf
"{%s}"
(
commas
$
map
show
a
)
ExprCall
a
->
show
a
UniOp
a
b
->
printf
"(%s %s)"
(
show
a
)
(
show
b
)
BinOp
a
b
c
->
printf
"(%s %s %s)"
(
show
b
)
(
show
a
)
(
show
c
)
Mux
a
b
c
->
printf
"(%s ? %s : %s)"
(
show
a
)
(
show
b
)
(
show
c
)
Bit
a
b
->
printf
"(%s [%d])"
(
show
a
)
b
instance
Bits
Expr
where
(
.&.
)
=
BinOp
BWAnd
...
...
@@ -299,14 +275,6 @@ instance Bits Expr where
bit
=
error
"Not supported: bit"
popCount
=
error
"Not supported: popCount"
instance
Semigroup
Expr
where
(
<>
)
=
mappend
instance
Monoid
Expr
where
mempty
=
0
mappend
a
b
=
mconcat
[
a
,
b
]
mconcat
=
Concat
data
LHS
=
LHS
Identifier
|
LHSBit
Identifier
Expr
...
...
@@ -316,8 +284,8 @@ data LHS
instance
Show
LHS
where
show
(
LHS
a
)
=
a
show
(
LHSBit
a
b
)
=
printf
"%s[%s]"
a
(
show
ExprConst
b
)
show
(
LHSRange
a
(
b
,
c
))
=
printf
"%s[%s:%s]"
a
(
show
ExprConst
b
)
(
showExprConst
c
)
show
(
LHSBit
a
b
)
=
printf
"%s[%s]"
a
(
show
b
)
show
(
LHSRange
a
(
b
,
c
))
=
printf
"%s[%s:%s]"
a
(
show
b
)
(
show
c
)
show
(
LHSConcat
a
)
=
printf
"{%s}"
(
commas
$
map
show
a
)
data
Stmt
...
...
Language/SystemVerilog/Parser/Parse.y
View file @
b0d573c5
...
...
@@ -4,7 +4,6 @@ module Language.SystemVerilog.Parser.Parse (modules) where
import Data.Bits
import Data.List
import Data.BitVec
import Data.Maybe
import Language.SystemVerilog.AST
import Language.SystemVerilog.Parser.Tokens
...
...
@@ -362,8 +361,8 @@ CaseDefault :: { Maybe Stmt }
: { Nothing }
| "default" ":" Stmt { Just $3 }
Number :: {
BitVec
}
: number { toNumber
$1 }
Number :: {
String
}
: number { tokenString
$1 }
String :: { String }
: string { toString $1 }
...
...
@@ -435,25 +434,6 @@ parseError a = case a of
toString :: Token -> String
toString = tail . init . tokenString
toNumber :: Token -> BitVec
toNumber = number . tokenString
where
number :: String -> BitVec
number a
| all (flip elem ['0' .. '9']) a = fromInteger $ read a
| head a == '\'' = fromInteger $ f a
| isInfixOf "'" a = bitVec (read w) (f b)
| otherwise = error $ "Invalid number format: " ++ a
where
w = takeWhile (/= '\'') a
b = dropWhile (/= '\'') a
f a
| isPrefixOf "'d" a = read $ drop 2 a
| isPrefixOf "'h" a = read $ "0x" ++ drop 2 a
| isPrefixOf "'b" a = foldl (\ n b -> shiftL n 1 .|. (if b == '1' then 1 else 0)) 0 (drop 2 a)
| otherwise = error $ "Invalid number format: " ++ a
portDeclToModuleItems
:: Direction
-> (Maybe ((Maybe Range) -> Type))
...
...
sv2v.cabal
View file @
b0d573c5
...
...
@@ -31,7 +31,6 @@ library
array >= 0.5.1.0 && < 0.6
exposed-modules:
Data.BitVec
Language.SystemVerilog
Language.SystemVerilog.AST
Language.SystemVerilog.Parser
...
...
@@ -52,7 +51,6 @@ executable sv2v
array,
base
other-modules:
Data.BitVec
Language.SystemVerilog
Language.SystemVerilog.AST
Language.SystemVerilog.Parser
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment