summaryrefslogtreecommitdiff
path: root/src/Language/Fiddle/Compiler/ConsistencyCheck.hs
diff options
context:
space:
mode:
authorJosh Rahm <joshuarahm@gmail.com>2024-11-26 22:55:13 -0700
committerJosh Rahm <joshuarahm@gmail.com>2024-11-26 22:55:13 -0700
commit7f5b64062ed975f856892d95e74b8d2f917ade66 (patch)
tree762b837c9fd461b8e1be5e852a3a560eeeda4d78 /src/Language/Fiddle/Compiler/ConsistencyCheck.hs
parent4f43488bdd32b610f7771dc01a12541fdb17b9af (diff)
downloadfiddle-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.hs39
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