summaryrefslogtreecommitdiff
path: root/src/Language/Fiddle/Compiler/ConsistencyCheck.hs
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2024-10-13 01:20:11 -0600
committerJosh Rahm <joshuarahm@gmail.com>2024-10-13 01:20:11 -0600
commit5924b745fbaf52000981c298ec8f18b3c0c4a1be (patch)
treebfbc9398ab6b918eca35961c26126d92f748e8d3 /src/Language/Fiddle/Compiler/ConsistencyCheck.hs
parentda0d596946cf21e2f275dd03b40c0a6c0824f66b (diff)
downloadfiddle-5924b745fbaf52000981c298ec8f18b3c0c4a1be.tar.gz
fiddle-5924b745fbaf52000981c298ec8f18b3c0c4a1be.tar.bz2
fiddle-5924b745fbaf52000981c298ec8f18b3c0c4a1be.zip
Start implementing a bunch of the C backend.
Have basic implementations down for coarse registers. Working on getting bitfields supported.
Diffstat (limited to 'src/Language/Fiddle/Compiler/ConsistencyCheck.hs')
-rw-r--r--src/Language/Fiddle/Compiler/ConsistencyCheck.hs21
1 files changed, 10 insertions, 11 deletions
diff --git a/src/Language/Fiddle/Compiler/ConsistencyCheck.hs b/src/Language/Fiddle/Compiler/ConsistencyCheck.hs
index 4be2912..3d95ea0 100644
--- a/src/Language/Fiddle/Compiler/ConsistencyCheck.hs
+++ b/src/Language/Fiddle/Compiler/ConsistencyCheck.hs
@@ -153,14 +153,15 @@ advanceObjTypeBody (ObjTypeBody us decls a) startOffset = do
assertedPos <- expressionToIntM expr
checkPositionAssertion (annot e) assertedPos offset
return (ret, offset)
- (RegisterDecl _ mod ident size Nothing a) -> do
+ (RegisterDecl qmeta mod ident size Nothing a) -> do
(sizeExpr, reifiedSize) <- advanceAndGetSize size
reifiedSizeBytes <- checkBitsSizeMod8 a reifiedSize
let span = Present (FieldSpan offset reifiedSizeBytes)
- doReturn (RegisterDecl span mod ident sizeExpr Nothing a)
+ qmeta' = fmap (\q -> q {regSpan = span}) qmeta
+ doReturn (RegisterDecl qmeta' mod ident sizeExpr Nothing a)
=<< checkBitsSizeMod8 a reifiedSize
- (RegisterDecl _ mod ident size (Just body) a) -> do
+ (RegisterDecl qmeta mod ident size (Just body) a) -> do
declaredSize <- expressionToIntM size
(actualSize, body') <- advanceRegisterBody body
@@ -170,12 +171,8 @@ advanceObjTypeBody (ObjTypeBody us decls a) startOffset = do
reifiedSizeBytes <- checkBitsSizeMod8 a reifiedSize
let span = Present (FieldSpan offset reifiedSizeBytes)
- doReturn (RegisterDecl span mod ident sizeExpr (Just body') a) reifiedSizeBytes
- (ReservedDecl _ i size a) -> do
- (sizeExpr, reifiedSize) <- advanceAndGetSize size
- reifiedSizeBytes <- checkBitsSizeMod8 a reifiedSize
- let span = Present (FieldSpan offset reifiedSizeBytes)
- doReturn (ReservedDecl span i sizeExpr a) reifiedSizeBytes
+ qmeta' = fmap (\q -> q {regSpan = span}) qmeta
+ doReturn (RegisterDecl qmeta' mod ident sizeExpr (Just body') a) reifiedSizeBytes
(TypeSubStructure (Identity body) name a) -> do
(size, body') <- advanceObjTypeBody body offset
doReturn (TypeSubStructure (Identity body') name a) size
@@ -245,11 +242,13 @@ advanceDecl offset = \case
<$> advanceStage () expr
<*> pure an
)
- DefinedBits _ mod ident typ annot -> do
+ DefinedBits qmeta mod ident typ annot -> do
size <- bitsTypeSize typ
let span = Present (FieldSpan offset size)
+ qmeta' = fmap (\q -> q {bitsSpan = span}) qmeta
+
(size,)
- <$> (DefinedBits span mod ident <$> advanceStage () typ <*> pure annot)
+ <$> (DefinedBits qmeta' mod ident <$> advanceStage () typ <*> pure annot)
BitsSubStructure subBody subName ann -> do
(sz, body') <- advanceRegisterBody subBody
return (sz, BitsSubStructure body' subName ann)