diff options
author | Josh Rahm <joshuarahm@gmail.com> | 2024-11-26 22:55:13 -0700 |
---|---|---|
committer | Josh Rahm <joshuarahm@gmail.com> | 2024-11-26 22:55:13 -0700 |
commit | 7f5b64062ed975f856892d95e74b8d2f917ade66 (patch) | |
tree | 762b837c9fd461b8e1be5e852a3a560eeeda4d78 /src/Language/Fiddle/Compiler/ConsistencyCheck.hs | |
parent | 4f43488bdd32b610f7771dc01a12541fdb17b9af (diff) | |
download | fiddle-7f5b64062ed975f856892d95e74b8d2f917ade66.tar.gz fiddle-7f5b64062ed975f856892d95e74b8d2f917ade66.tar.bz2 fiddle-7f5b64062ed975f856892d95e74b8d2f917ade66.zip |
Added syntax for skip_to and buffer.
buffer tells fiddle to create a buffer of a number of bytes.
skip_to tells fiddle to skip to some new offset. It's essentially an
unnamed buffer
Diffstat (limited to 'src/Language/Fiddle/Compiler/ConsistencyCheck.hs')
-rw-r--r-- | src/Language/Fiddle/Compiler/ConsistencyCheck.hs | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/Language/Fiddle/Compiler/ConsistencyCheck.hs b/src/Language/Fiddle/Compiler/ConsistencyCheck.hs index 00a53dc..c34007f 100644 --- a/src/Language/Fiddle/Compiler/ConsistencyCheck.hs +++ b/src/Language/Fiddle/Compiler/ConsistencyCheck.hs @@ -15,6 +15,7 @@ import Data.Functor.Identity import qualified Data.IntMap as IntMap import Data.List (intercalate) import qualified Data.List.NonEmpty as NonEmpty +import qualified Data.Text as Text import Data.Typeable import GHC.TypeError as TypeError import Language.Fiddle.Ast @@ -155,6 +156,44 @@ advanceObjTypeBody (ObjTypeBody us decls a) startOffset = do assertedPos <- expressionToIntM expr checkPositionAssertion (annot e) assertedPos offset return (ret, offset) + (SkipToStatement _ qmeta expr ann) -> do + let pos = trueValue expr + sz = if pos < offset then 0 else pos - offset + span = Present (FieldSpan offset sz) + qmeta' = fmap (\q -> q {regSpan = span}) qmeta + + szExpr = ConstExpression (LeftV sz) (annot expr) + in do + if pos < offset + then do + emitDiagnosticError "Skip to backwards" ann + return (ret, offset) + else + if sz == 0 + then + return (ret, offset) + else do + doReturn + ( BufferDecl + qmeta' + ( Guaranteed + ( Identifier + ( Text.pack $ + basenamePart (regFullPath (unwrap qmeta')) + ) + a + ) + ) + szExpr + ann + ) + sz + (BufferDecl qmeta (Guaranteed ident) sz a) -> do + sz' <- advanceStage () sz + let size = trueValue sz' + span = Present (FieldSpan offset size) + qmeta' = fmap (\q -> q {regSpan = span}) qmeta + doReturn (BufferDecl qmeta' (Guaranteed ident) sz' a) size (RegisterDecl qmeta mod ident size Nothing a) -> do let declaredSize = regSzToBits (getLeft size) reifiedSizeBytes <- checkBitsSizeMod8 a declaredSize |