summaryrefslogtreecommitdiff
path: root/src/Language/Fiddle/Compiler/Qualification.hs
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2024-10-27 22:31:38 -0600
committerJosh Rahm <joshuarahm@gmail.com>2024-10-27 22:31:38 -0600
commit4b85b09593fae1b72a6d64b09a7843f9a28dbe99 (patch)
treec66fbdf882d70a4228311a174736d52908d903b4 /src/Language/Fiddle/Compiler/Qualification.hs
parent5d3f21123b585fb1c43da9d854b04c61678405df (diff)
downloadfiddle-4b85b09593fae1b72a6d64b09a7843f9a28dbe99.tar.gz
fiddle-4b85b09593fae1b72a6d64b09a7843f9a28dbe99.tar.bz2
fiddle-4b85b09593fae1b72a6d64b09a7843f9a28dbe99.zip
Enforce that registers are either 8, 16, 32, or 64 bits.
Fixed the issues where the output C code did not use correct register sizes.
Diffstat (limited to 'src/Language/Fiddle/Compiler/Qualification.hs')
-rw-r--r--src/Language/Fiddle/Compiler/Qualification.hs18
1 files changed, 15 insertions, 3 deletions
diff --git a/src/Language/Fiddle/Compiler/Qualification.hs b/src/Language/Fiddle/Compiler/Qualification.hs
index e8ab479..eae219e 100644
--- a/src/Language/Fiddle/Compiler/Qualification.hs
+++ b/src/Language/Fiddle/Compiler/Qualification.hs
@@ -177,6 +177,18 @@ instance AdvanceStage S RegisterBitsDecl where
<$> advanceStage localState typ
<*> pure an
+getProperRegSize :: (stage .< Expanded ~ False) => Expression Bits stage F A -> M RegSz
+getProperRegSize expr = do
+ v <- expressionToIntM expr
+ case v of
+ 8 -> return RegSz8
+ 16 -> return RegSz16
+ 32 -> return RegSz32
+ 64 -> return RegSz64
+ _ -> do
+ emitDiagnosticError "Exotic register size." (annot expr)
+ return RegSz32
+
instance AdvanceStage S ObjTypeDecl where
advanceStage localState = \case
AssertPosStatement d e a ->
@@ -202,7 +214,7 @@ instance AdvanceStage S ObjTypeDecl where
(Present qRegMeta)
(guarantee (ModifierKeyword Rw ann) mod)
ident'
- <$> advanceStage localState'' size
+ <$> progressBackM getProperRegSize size
<*> mapM (advanceStage localState'') bod
<*> pure ann
ReservedDecl _ expr ann -> do
@@ -222,7 +234,7 @@ instance AdvanceStage S ObjTypeDecl where
(Present qRegMeta)
(Guaranteed $ ModifierKeyword Pr ann)
(Guaranteed ident)
- <$> advanceStage localState expr
+ <$> fmap LeftV (getProperRegSize expr)
<*> pure Nothing
<*> pure ann
TypeSubStructure bod name an -> do
@@ -482,7 +494,7 @@ calculateTypeSize (ObjTypeBody bodyType decls _) =
calculateDeclSize (undirected -> decl) =
case decl of
AssertPosStatement {} -> return 0
- RegisterDecl {regSize = size} -> fst . bitsToBytes <$> expressionToIntM size
+ RegisterDecl {regSize = size} -> fst . bitsToBytes <$> expressionToIntM (getRight size)
ReservedDecl {reservedExpr = size} -> fst . bitsToBytes <$> expressionToIntM size
TypeSubStructure {subStructureBody = b} -> calculateTypeSize =<< resolveOrFail b