Commit a2d0872d by Zachary Snow

support for delays on continuous assignments

parent ec06b2b9
...@@ -177,7 +177,7 @@ inlineInterface (ports, items) (instanceName, instancePorts) = ...@@ -177,7 +177,7 @@ inlineInterface (ports, items) (instanceName, instancePorts) =
then ports then ports
else origInstancePortNames else origInstancePortNames
portBindings = portBindings =
map (\(ident, Just expr) -> Assign (LHSIdent ident) expr) $ map (\(ident, Just expr) -> Assign Nothing (LHSIdent ident) expr) $
filter (isJust . snd) $ filter (isJust . snd) $
zip instancePortNames instancePortExprs zip instancePortNames instancePortExprs
......
...@@ -167,7 +167,7 @@ unflattener writeToFlatVariant arr (t, (majorHi, majorLo)) = ...@@ -167,7 +167,7 @@ unflattener writeToFlatVariant arr (t, (majorHi, majorLo)) =
[ localparam startBit [ localparam startBit
(simplify $ BinOp Add majorLo (simplify $ BinOp Add majorLo
(BinOp Mul (Ident index) size)) (BinOp Mul (Ident index) size))
, GenModuleItem $ (uncurry Assign) $ , GenModuleItem $ (uncurry $ Assign Nothing) $
if not writeToFlatVariant if not writeToFlatVariant
then (LHSBit (LHSIdent arrUnflat) $ Ident index, Range (Ident arr) origRange) then (LHSBit (LHSIdent arrUnflat) $ Ident index, Range (Ident arr) origRange)
else (LHSRange (LHSIdent arr) origRange, Bit (Ident arrUnflat) (Ident index)) else (LHSRange (LHSIdent arr) origRange, Bit (Ident arrUnflat) (Ident index))
......
...@@ -301,14 +301,16 @@ traverseExprsM mapper = moduleItemMapper ...@@ -301,14 +301,16 @@ traverseExprsM mapper = moduleItemMapper
moduleItemMapper (MIDecl decl) = moduleItemMapper (MIDecl decl) =
declMapper decl >>= return . MIDecl declMapper decl >>= return . MIDecl
moduleItemMapper (Assign lhs expr) =
exprMapper expr >>= return . Assign lhs
moduleItemMapper (Defparam lhs expr) = moduleItemMapper (Defparam lhs expr) =
exprMapper expr >>= return . Defparam lhs exprMapper expr >>= return . Defparam lhs
moduleItemMapper (AlwaysC kw stmt) = moduleItemMapper (AlwaysC kw stmt) =
stmtMapper stmt >>= return . AlwaysC kw stmtMapper stmt >>= return . AlwaysC kw
moduleItemMapper (Initial stmt) = moduleItemMapper (Initial stmt) =
stmtMapper stmt >>= return . Initial stmtMapper stmt >>= return . Initial
moduleItemMapper (Assign delay lhs expr) = do
delay' <- maybeExprMapper delay
expr' <- exprMapper expr
return $ Assign delay' lhs expr'
moduleItemMapper (MIPackageItem (Function lifetime ret f decls stmts)) = do moduleItemMapper (MIPackageItem (Function lifetime ret f decls stmts)) = do
decls' <- mapM declMapper decls decls' <- mapM declMapper decls
stmts' <- mapM stmtMapper stmts stmts' <- mapM stmtMapper stmts
...@@ -349,9 +351,9 @@ traverseLHSsM :: Monad m => MapperM m LHS -> MapperM m ModuleItem ...@@ -349,9 +351,9 @@ traverseLHSsM :: Monad m => MapperM m LHS -> MapperM m ModuleItem
traverseLHSsM mapper item = traverseLHSsM mapper item =
traverseStmtsM (traverseStmtLHSsM mapper) item >>= traverseModuleItemLHSsM traverseStmtsM (traverseStmtLHSsM mapper) item >>= traverseModuleItemLHSsM
where where
traverseModuleItemLHSsM (Assign lhs expr) = do traverseModuleItemLHSsM (Assign delay lhs expr) = do
lhs' <- mapper lhs lhs' <- mapper lhs
return $ Assign lhs' expr return $ Assign delay lhs' expr
traverseModuleItemLHSsM (Defparam lhs expr) = do traverseModuleItemLHSsM (Defparam lhs expr) = do
lhs' <- mapper lhs lhs' <- mapper lhs
return $ Defparam lhs' expr return $ Defparam lhs' expr
...@@ -496,9 +498,9 @@ traverseAsgnsM mapper = moduleItemMapper ...@@ -496,9 +498,9 @@ traverseAsgnsM mapper = moduleItemMapper
where where
moduleItemMapper item = miMapperA item >>= miMapperB moduleItemMapper item = miMapperA item >>= miMapperB
miMapperA (Assign lhs expr) = do miMapperA (Assign delay lhs expr) = do
(lhs', expr') <- mapper (lhs, expr) (lhs', expr') <- mapper (lhs, expr)
return $ Assign lhs' expr' return $ Assign delay lhs' expr'
miMapperA (Defparam lhs expr) = do miMapperA (Defparam lhs expr) = do
(lhs', expr') <- mapper (lhs, expr) (lhs', expr') <- mapper (lhs, expr)
return $ Defparam lhs' expr' return $ Defparam lhs' expr'
......
...@@ -111,7 +111,7 @@ instance Show PartKW where ...@@ -111,7 +111,7 @@ instance Show PartKW where
data ModuleItem data ModuleItem
= MIDecl Decl = MIDecl Decl
| AlwaysC AlwaysKW Stmt | AlwaysC AlwaysKW Stmt
| Assign LHS Expr | Assign (Maybe Expr) LHS Expr
| Defparam LHS Expr | Defparam LHS Expr
| Instance Identifier [PortBinding] Identifier (Maybe Range) [PortBinding] | Instance Identifier [PortBinding] Identifier (Maybe Range) [PortBinding]
| Genvar Identifier | Genvar Identifier
...@@ -143,7 +143,8 @@ instance Show ModuleItem where ...@@ -143,7 +143,8 @@ instance Show ModuleItem where
show thing = case thing of show thing = case thing of
MIDecl nest -> show nest MIDecl nest -> show nest
AlwaysC k b -> printf "%s %s" (show k) (show b) AlwaysC k b -> printf "%s %s" (show k) (show b)
Assign a b -> printf "assign %s = %s;" (show a) (show b) Assign d a b -> printf "assign %s%s = %s;" delayStr (show a) (show b)
where delayStr = maybe "" (\e -> "#(" ++ show e ++ ") ") d
Defparam a b -> printf "defparam %s = %s;" (show a) (show b) Defparam a b -> printf "defparam %s = %s;" (show a) (show b)
Instance m params i r ports Instance m params i r ports
| null params -> printf "%s %s%s%s;" m i rStr (showPorts ports) | null params -> printf "%s %s%s%s;" m i rStr (showPorts ports)
......
...@@ -396,7 +396,7 @@ ModuleItem :: { [ModuleItem] } ...@@ -396,7 +396,7 @@ ModuleItem :: { [ModuleItem] }
| "parameter" ParamType DeclAsgns ";" { map MIDecl $ map (uncurry $ Parameter $2) $3 } | "parameter" ParamType DeclAsgns ";" { map MIDecl $ map (uncurry $ Parameter $2) $3 }
| "localparam" ParamType DeclAsgns ";" { map MIDecl $ map (uncurry $ Localparam $2) $3 } | "localparam" ParamType DeclAsgns ";" { map MIDecl $ map (uncurry $ Localparam $2) $3 }
| "defparam" DefparamAsgns ";" { map (uncurry Defparam) $2 } | "defparam" DefparamAsgns ";" { map (uncurry Defparam) $2 }
| "assign" LHS "=" Expr ";" { [Assign $2 $4] } | "assign" opt(DelayControl) LHS "=" Expr ";" { [Assign $2 $3 $5] }
| AlwaysKW Stmt { [AlwaysC $1 $2] } | AlwaysKW Stmt { [AlwaysC $1 $2] }
| "initial" Stmt { [Initial $2] } | "initial" Stmt { [Initial $2] }
| "genvar" Identifiers ";" { map Genvar $2 } | "genvar" Identifiers ";" { map Genvar $2 }
...@@ -554,19 +554,19 @@ DeclOrStmt :: { ([Decl], [Stmt]) } ...@@ -554,19 +554,19 @@ DeclOrStmt :: { ([Decl], [Stmt]) }
TimingControl :: { Timing } TimingControl :: { Timing }
: DelayOrEventControl { $1 } : DelayOrEventControl { $1 }
| CycleDelay { $1 } | CycleDelay { Cycle $1 }
DelayOrEventControl :: { Timing } DelayOrEventControl :: { Timing }
: DelayControl { $1 } : DelayControl { Delay $1 }
| EventControl { $1 } | EventControl { Event $1 }
DelayControl :: { Timing } DelayControl :: { Expr }
: "#" DelayValue { Delay $2 } : "#" DelayValue { $2 }
| "#" "(" Expr ")" { Delay $3 } | "#" "(" Expr ")" { $3 }
CycleDelay :: { Timing } CycleDelay :: { Expr }
: "##" Expr { Cycle $2 } : "##" Expr { $2 }
EventControl :: { Timing } EventControl :: { Sense }
: "@" "(" Senses ")" { Event $3 } : "@" "(" Senses ")" { $3 }
| "@" "(*)" { Event SenseStar } | "@" "(*)" { SenseStar }
| "@*" { Event SenseStar } | "@*" { SenseStar }
Senses :: { Sense } Senses :: { Sense }
: Sense { $1 } : Sense { $1 }
| Senses "or" Sense { SenseOr $1 $3 } | Senses "or" Sense { SenseOr $1 $3 }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment