diff options
author | Josh Rahm <joshuarahm@gmail.com> | 2024-10-11 16:19:21 -0600 |
---|---|---|
committer | Josh Rahm <joshuarahm@gmail.com> | 2024-10-11 16:19:21 -0600 |
commit | 1e820e50668631a239cfc3188137cc90c34cf738 (patch) | |
tree | c2f2271d17199d97b91b397be46da075a569b21c /src/Language/Fiddle/Compiler/ConsistencyCheck.hs | |
parent | 8082f91fd9fd1bdcbde5ebf74ed4710cdbb0c6c5 (diff) | |
download | fiddle-1e820e50668631a239cfc3188137cc90c34cf738.tar.gz fiddle-1e820e50668631a239cfc3188137cc90c34cf738.tar.bz2 fiddle-1e820e50668631a239cfc3188137cc90c34cf738.zip |
Further implement C backend.
There is a problem where I'm mixing up bits and bytes. I think I'll try
to resolve that using more type-level constraints.
Diffstat (limited to 'src/Language/Fiddle/Compiler/ConsistencyCheck.hs')
-rw-r--r-- | src/Language/Fiddle/Compiler/ConsistencyCheck.hs | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/src/Language/Fiddle/Compiler/ConsistencyCheck.hs b/src/Language/Fiddle/Compiler/ConsistencyCheck.hs index 552ea40..e0c7876 100644 --- a/src/Language/Fiddle/Compiler/ConsistencyCheck.hs +++ b/src/Language/Fiddle/Compiler/ConsistencyCheck.hs @@ -149,18 +149,21 @@ advanceObjTypeBody (ObjTypeBody us decls a) startOffset = do return (ret, offset) (RegisterDecl _ mod ident size Nothing a) -> do (sizeExpr, reifiedSize) <- advanceAndGetSize size - doReturn (RegisterDecl offset mod ident sizeExpr Nothing a) + let span = Present (FieldSpan (N offset) (N reifiedSize)) + doReturn (RegisterDecl span mod ident sizeExpr Nothing a) =<< checkBitsSizeMod8 a reifiedSize (RegisterDecl _ mod ident size (Just body) a) -> do declaredSize <- expressionToIntM size (actualSize, body') <- advanceRegisterBody body checkSizeMismatch a declaredSize actualSize (sizeExpr, reifiedSize) <- advanceAndGetSize size - doReturn (RegisterDecl offset mod ident sizeExpr (Just body') a) + let span = Present (FieldSpan (N offset) (N reifiedSize)) + doReturn (RegisterDecl span mod ident sizeExpr (Just body') a) =<< checkBitsSizeMod8 a reifiedSize - (ReservedDecl size a) -> do + (ReservedDecl _ i size a) -> do (sizeExpr, reifiedSize) <- advanceAndGetSize size - doReturn (ReservedDecl sizeExpr a) reifiedSize + let span = Present (FieldSpan (N offset) (N reifiedSize)) + doReturn (ReservedDecl span i sizeExpr a) reifiedSize (TypeSubStructure (Identity body) name a) -> do (size, body') <- advanceObjTypeBody body offset doReturn (TypeSubStructure (Identity body') name a) size @@ -231,8 +234,9 @@ advanceDecl offset = \case ) DefinedBits _ mod ident typ annot -> do size <- bitsTypeSize typ + let span = Present (FieldSpan (N offset) (N size)) (size,) - <$> (DefinedBits offset mod ident <$> advanceStage () typ <*> pure annot) + <$> (DefinedBits span mod ident <$> advanceStage () typ <*> pure annot) BitsSubStructure subBody subName ann -> do (sz, body') <- advanceRegisterBody subBody return (sz, BitsSubStructure body' subName ann) |