diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Language/Fiddle/Ast/Internal/SyntaxTree.hs | 7 | ||||
-rw-r--r-- | src/Language/Fiddle/Compiler/ConsistencyCheck.hs | 7 | ||||
-rw-r--r-- | src/Language/Fiddle/Compiler/Expansion.hs | 45 | ||||
-rw-r--r-- | src/Language/Fiddle/Compiler/Qualification.hs | 4 | ||||
-rw-r--r-- | src/Language/Fiddle/Parser.hs | 15 | ||||
-rw-r--r-- | src/Language/Fiddle/Tokenizer.hs | 4 |
6 files changed, 71 insertions, 11 deletions
diff --git a/src/Language/Fiddle/Ast/Internal/SyntaxTree.hs b/src/Language/Fiddle/Ast/Internal/SyntaxTree.hs index a4f98e3..0e4894e 100644 --- a/src/Language/Fiddle/Ast/Internal/SyntaxTree.hs +++ b/src/Language/Fiddle/Ast/Internal/SyntaxTree.hs @@ -50,6 +50,7 @@ module Language.Fiddle.Ast.Internal.SyntaxTree EnumBody (..), EnumConstantDecl (..), PackageBody (..), + RegisterPosition(..), -- Helper Functions regSzToBits, mapDirected, @@ -507,6 +508,9 @@ data ObjType stage f a where ObjType stage f a deriving (Typeable, Generic, Alter, Annotated, Typeable, Walk) +newtype RegisterPosition = RegisterPosition (Maybe Text) + deriving newtype (Eq, Ord, Show, Generic, FromJSON, ToJSON) + -- | Represents a declaration inside an object type, such as a register, an -- assertion, or a substructure. data ObjTypeDecl stage f a where @@ -557,6 +561,9 @@ data ObjTypeDecl stage f a where regIdent :: Guaranteed (stage .>= Qualified) (Identifier f a), -- | Size of the register. regSize :: Variant (stage .>= Qualified) RegSz (Expression Bits stage f a), + -- | Declared register position. This gets turned into a "skip-to" + -- statement during expansion. + regPos :: When (stage .< Expanded) RegisterPosition, -- | Optional register body. regBody :: Maybe (RegisterBody stage f a), -- | Annotation for the register declaration. diff --git a/src/Language/Fiddle/Compiler/ConsistencyCheck.hs b/src/Language/Fiddle/Compiler/ConsistencyCheck.hs index c4924da..369aa02 100644 --- a/src/Language/Fiddle/Compiler/ConsistencyCheck.hs +++ b/src/Language/Fiddle/Compiler/ConsistencyCheck.hs @@ -194,15 +194,15 @@ advanceObjTypeBody (ObjTypeBody us decls a) startOffset = do 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 + (RegisterDecl qmeta mod ident size Vacant Nothing a) -> do 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 (changeRight size) Nothing a) + doReturn (RegisterDecl qmeta' mod ident (changeRight size) Vacant Nothing a) =<< checkBitsSizeMod8 a declaredSize - (RegisterDecl qmeta mod ident size (Just body) a) -> do + (RegisterDecl qmeta mod ident size Vacant (Just body) a) -> do let declaredSize = regSzToBits (getLeft size) (actualSize, body') <- advanceRegisterBody 0 body @@ -218,6 +218,7 @@ advanceObjTypeBody (ObjTypeBody us decls a) startOffset = do mod ident (changeRight size) + Vacant (Just body') a ) diff --git a/src/Language/Fiddle/Compiler/Expansion.hs b/src/Language/Fiddle/Compiler/Expansion.hs index 94042a2..71e7fd2 100644 --- a/src/Language/Fiddle/Compiler/Expansion.hs +++ b/src/Language/Fiddle/Compiler/Expansion.hs @@ -50,7 +50,42 @@ instance CompilationStage CurrentStage where type StageFunctor CurrentStage = Identity type StageAnnotation CurrentStage = Annot -deriving instance AdvanceStage CurrentStage ObjTypeBody +instance AdvanceStage CurrentStage ObjTypeBody where + advanceStage path (ObjTypeBody typ decls ann) = + ObjTypeBody typ + <$> fmap + concat + ( mapM + ( \case + decl@( undirected -> + RegisterDecl + { regPos = Present (RegisterPosition (Just pos)), + regAnnot = ann + } + ) -> do + sequence + [ do + nu <- parseNum (unCommented ann) pos + return + ( asDirected $ + SkipToStatement + Witness + Vacant + ( ConstExpression + ( RightV + (LitNum (RightV nu) ann) + ) + ann + ) + ann + ), + advanceStage path decl + ] + decl -> sequence [advanceStage path decl] + ) + decls + ) + <*> pure ann deriving instance AdvanceStage CurrentStage DeferredRegisterBody @@ -81,6 +116,14 @@ instance AdvanceStage CurrentStage PackageBody where advanceStage p (PackageBody decls a) = PackageBody <$> reconfigureFiddleDecls p decls <*> pure a +instance + StageConvertible + ImportsResolved + (When True RegisterPosition) + (When False RegisterPosition) + where + convertInStage _ _ _ _ = return Vacant + instance AdvanceStage CurrentStage ObjTypeDecl where modifyState t = return diff --git a/src/Language/Fiddle/Compiler/Qualification.hs b/src/Language/Fiddle/Compiler/Qualification.hs index ac99f48..4f3d380 100644 --- a/src/Language/Fiddle/Compiler/Qualification.hs +++ b/src/Language/Fiddle/Compiler/Qualification.hs @@ -239,7 +239,7 @@ instance AdvanceStage S ObjTypeDecl where ident' <$> advanceStage localState'' sz <*> pure ann - RegisterDecl _ mod ident size bod ann -> do + RegisterDecl _ mod ident size Vacant bod ann -> do ident' <- guaranteeM (uniqueIdentifier "reg" ann) ident let (qualified, localState') = @@ -261,6 +261,7 @@ instance AdvanceStage S ObjTypeDecl where (guarantee (ModifierKeyword Rw ann) mod) ident' <$> progressBackM getProperRegSize size + <*> pure Vacant <*> mapM (advanceStage localState'') bod <*> pure ann ReservedDecl _ expr ann -> do @@ -281,6 +282,7 @@ instance AdvanceStage S ObjTypeDecl where (Guaranteed $ ModifierKeyword Pr ann) (Guaranteed ident) <$> fmap LeftV (getProperRegSize expr) + <*> pure Vacant <*> pure Nothing <*> pure ann TypeSubStructure bod name an -> do diff --git a/src/Language/Fiddle/Parser.hs b/src/Language/Fiddle/Parser.hs index e91fa41..b2bb6f7 100644 --- a/src/Language/Fiddle/Parser.hs +++ b/src/Language/Fiddle/Parser.hs @@ -238,6 +238,7 @@ objTypeDeclP = RegisterDecl Vacant modifier . Perhaps <$> optionMaybe ident <*> fmap RightV exprInParenP + <*> (Present . RegisterPosition <$> optionMaybe (tok TokAtSign >> litNumP)) <*> optionMaybe (tok TokColon *> registerBodyP) ) @@ -338,14 +339,18 @@ enumConstantDeclP = constExpressionP :: Pa (ConstExpression u) constExpressionP = withMeta $ ConstExpression . RightV <$> expressionP +litNumP :: P Text +litNumP = + token + ( \case + (TokLitNum num) -> Just num + _ -> Nothing + ) + expressionP :: Pa (Expression u) expressionP = withMeta $ - token - ( \case - (TokLitNum num) -> Just (LitNum $ LeftV num) - _ -> Nothing - ) + (LitNum . LeftV <$> litNumP) <|> (Var <$> name) body :: P [Token SourceSpan] diff --git a/src/Language/Fiddle/Tokenizer.hs b/src/Language/Fiddle/Tokenizer.hs index 4590ed0..c4b53d2 100644 --- a/src/Language/Fiddle/Tokenizer.hs +++ b/src/Language/Fiddle/Tokenizer.hs @@ -48,6 +48,7 @@ data T | TokString !Text | TokDirectiveStart -- [[ | TokDirectiveEnd -- ]] + | TokAtSign deriving (Eq, Ord, Show, Read) textOf :: T -> Maybe Text @@ -154,7 +155,8 @@ parseToken = spaces *> tok parseToken' <* spaces char '}' $> TokRBrace, char ']' $> TokRBracket, char ')' $> TokRParen, - char ';' $> TokSemi + char ';' $> TokSemi, + char '@' $> TokAtSign ] where a $> b = a >> return b |