summaryrefslogtreecommitdiff
path: root/src/Language/Fiddle/Compiler/ConsistencyCheck.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/ConsistencyCheck.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/ConsistencyCheck.hs')
-rw-r--r--src/Language/Fiddle/Compiler/ConsistencyCheck.hs28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/Language/Fiddle/Compiler/ConsistencyCheck.hs b/src/Language/Fiddle/Compiler/ConsistencyCheck.hs
index 3def59d..00a53dc 100644
--- a/src/Language/Fiddle/Compiler/ConsistencyCheck.hs
+++ b/src/Language/Fiddle/Compiler/ConsistencyCheck.hs
@@ -156,25 +156,33 @@ advanceObjTypeBody (ObjTypeBody us decls a) startOffset = do
checkPositionAssertion (annot e) assertedPos offset
return (ret, offset)
(RegisterDecl qmeta mod ident size Nothing a) -> do
- (sizeExpr, reifiedSize) <- advanceAndGetSize size
- reifiedSizeBytes <- checkBitsSizeMod8 a reifiedSize
+ let declaredSize = regSzToBits (getLeft size)
+ reifiedSizeBytes <- checkBitsSizeMod8 a declaredSize
let span = Present (FieldSpan offset reifiedSizeBytes)
qmeta' = fmap (\q -> q {regSpan = span}) qmeta
- doReturn (RegisterDecl qmeta' mod ident sizeExpr Nothing a)
- =<< checkBitsSizeMod8 a reifiedSize
+ doReturn (RegisterDecl qmeta' mod ident (changeRight size) Nothing a)
+ =<< checkBitsSizeMod8 a declaredSize
(RegisterDecl qmeta mod ident size (Just body) a) -> do
- declaredSize <- expressionToIntM size
- (actualSize, body') <- advanceRegisterBody 0 body
+ let declaredSize = regSzToBits (getLeft size)
+ (actualSize, body') <- advanceRegisterBody 0 body
checkSizeMismatch a declaredSize actualSize
-
- (sizeExpr, reifiedSize) <- advanceAndGetSize size
- reifiedSizeBytes <- checkBitsSizeMod8 a reifiedSize
+ reifiedSizeBytes <- checkBitsSizeMod8 a declaredSize
let span = Present (FieldSpan offset reifiedSizeBytes)
qmeta' = fmap (\q -> q {regSpan = span}) qmeta
- doReturn (RegisterDecl qmeta' mod ident sizeExpr (Just body') a) reifiedSizeBytes
+
+ doReturn
+ ( RegisterDecl
+ qmeta'
+ mod
+ ident
+ (changeRight size)
+ (Just body')
+ a
+ )
+ reifiedSizeBytes
(TypeSubStructure (Identity body) name a) -> do
(size, body') <- advanceObjTypeBody body offset
doReturn (TypeSubStructure (Identity body') name a) size