diff options
Diffstat (limited to 'src/Language/Fiddle/Compiler')
-rw-r--r-- | src/Language/Fiddle/Compiler/Backend/C.hs | 17 | ||||
-rw-r--r-- | src/Language/Fiddle/Compiler/ConsistencyCheck.hs | 5 | ||||
-rw-r--r-- | src/Language/Fiddle/Compiler/Expansion.hs | 2 | ||||
-rw-r--r-- | src/Language/Fiddle/Compiler/ImportResolution.hs | 2 | ||||
-rw-r--r-- | src/Language/Fiddle/Compiler/Qualification.hs | 28 |
5 files changed, 38 insertions, 16 deletions
diff --git a/src/Language/Fiddle/Compiler/Backend/C.hs b/src/Language/Fiddle/Compiler/Backend/C.hs index dd79bac..df31c8c 100644 --- a/src/Language/Fiddle/Compiler/Backend/C.hs +++ b/src/Language/Fiddle/Compiler/Backend/C.hs @@ -26,8 +26,8 @@ import Data.Text (Text) import qualified Data.Text as Text import Language.Fiddle.Ast import Language.Fiddle.Compiler.Backend -import qualified Language.Fiddle.Compiler.Backend.Internal.FragTree as FragTree import Language.Fiddle.Compiler.Backend.Internal.FormattedWriter +import qualified Language.Fiddle.Compiler.Backend.Internal.FragTree as FragTree import Language.Fiddle.Compiler.Backend.Internal.Writer import Language.Fiddle.Internal.UnitInterface import Language.Fiddle.Internal.UnitNumbers @@ -77,7 +77,7 @@ newtype CFileState = CFileState requireInclude :: String -> M () requireInclude file = do - b <- (Set.member file) <$> gets includedFiles + b <- gets (Set.member file . includedFiles) unless b $ do checkout hF $ text $ @@ -283,8 +283,8 @@ writeRegSet tell $ Text.pack $ printf " o->%s[%d] = in[%d];\n" fieldName i i tell "}\n\n" -pattern DefinedBitsP :: String -> NonEmpty String -> N Bits -> RegisterBitsDecl Checked f a -pattern DefinedBitsP bitsName bitsFullPath offset <- +pattern DefinedBitsP :: String -> NonEmpty String -> N Bits -> RegisterBitsTypeRef Checked f a -> RegisterBitsDecl Checked f a +pattern DefinedBitsP bitsName bitsFullPath offset typeRef <- ( DefinedBits { qBitsMetadata = Present @@ -295,17 +295,22 @@ pattern DefinedBitsP bitsName bitsFullPath offset <- { offset = offset }, bitsFullPath = (NonEmpty.last &&& id -> (bitsName, bitsFullPath)) - } + }, + definedBitsTypeRef = typeRef } ) +-- | Decomposes a type ref into a type name (String) and a list of dimensions +-- (in the case of being an array) +-- decomposeBitsTypeRef :: RegisterBitsTypeRef Checked I A -> (String, [N Unitless]) +-- decomposeBitsTypeRef (RegisterBitsJustBits ) writeRegisterBody :: StructName -> QRegMetadata True -> RegisterBody Checked I A -> M () writeRegisterBody structName regmeta = walk_ registerWalk where registerWalk :: forall t. (Walk t, Typeable t) => t I A -> M () registerWalk t = case () of () - | (Just (DefinedBitsP bitsName fullPath offset)) <- castTS t -> + | (Just (DefinedBitsP bitsName fullPath offset typeRef)) <- castTS t -> text $ Text.pack $ printf diff --git a/src/Language/Fiddle/Compiler/ConsistencyCheck.hs b/src/Language/Fiddle/Compiler/ConsistencyCheck.hs index 3d95ea0..3e81153 100644 --- a/src/Language/Fiddle/Compiler/ConsistencyCheck.hs +++ b/src/Language/Fiddle/Compiler/ConsistencyCheck.hs @@ -78,6 +78,8 @@ deriving instance AdvanceStage S PackageBody deriving instance AdvanceStage S FiddleDecl +deriving instance AdvanceStage S (ConstExpression u) + instance AdvanceStage S FiddleUnit where advanceStage () fu@(FiddleUnit _ decls a) = FiddleUnit (Present $ getUnitInterface fu) <$> mapM (advanceStage ()) decls <*> pure a @@ -256,8 +258,7 @@ advanceDecl offset = \case bitsTypeSize :: RegisterBitsTypeRef S F A -> M (N Bits) bitsTypeSize (RegisterBitsArray tr nExpr _) = do sz <- bitsTypeSize tr - n <- expressionToIntM nExpr - return (sz .*. n) + return (sz .*. trueValue nExpr) bitsTypeSize RegisterBitsReference { bitsRefQualificationMetadata = diff --git a/src/Language/Fiddle/Compiler/Expansion.hs b/src/Language/Fiddle/Compiler/Expansion.hs index d9bce1e..0443b8d 100644 --- a/src/Language/Fiddle/Compiler/Expansion.hs +++ b/src/Language/Fiddle/Compiler/Expansion.hs @@ -71,6 +71,8 @@ deriving instance AdvanceStage CurrentStage BitType deriving instance AdvanceStage CurrentStage EnumBody +deriving instance AdvanceStage CurrentStage (ConstExpression u) + deriving instance AdvanceStage CurrentStage EnumConstantDecl deriving instance (AdvanceStage CurrentStage t) => AdvanceStage CurrentStage (Directed t) diff --git a/src/Language/Fiddle/Compiler/ImportResolution.hs b/src/Language/Fiddle/Compiler/ImportResolution.hs index a27a1dc..2568025 100644 --- a/src/Language/Fiddle/Compiler/ImportResolution.hs +++ b/src/Language/Fiddle/Compiler/ImportResolution.hs @@ -111,6 +111,8 @@ deriving instance AdvanceStage CurrentStage AnonymousBitsType deriving instance AdvanceStage CurrentStage BitType +deriving instance AdvanceStage CurrentStage (ConstExpression u) + deriving instance AdvanceStage CurrentStage EnumBody deriving instance AdvanceStage CurrentStage EnumConstantDecl diff --git a/src/Language/Fiddle/Compiler/Qualification.hs b/src/Language/Fiddle/Compiler/Qualification.hs index 67d3f29..56f1122 100644 --- a/src/Language/Fiddle/Compiler/Qualification.hs +++ b/src/Language/Fiddle/Compiler/Qualification.hs @@ -94,6 +94,14 @@ instance where convertInStage _ _ _ _ = Present <$> uniqueString "reserved" +instance AdvanceStage S (ConstExpression u) where + advanceStage ls (ConstExpression (RightV exp) a) = + case exp of + Var var _ -> do + (_, ExportedLocationDecl _ v) <- resolveOrFail =<< resolveName var ls + return $ ConstExpression (LeftV $ fromIntegral v) a + LitNum (RightV v) _ -> return $ ConstExpression (LeftV v) a + deriving instance AdvanceStage S ObjTypeBody deriving instance AdvanceStage S DeferredRegisterBody @@ -326,11 +334,11 @@ advanceFiddleDecls localState decls = fmap (reverse . fst) $ do LocationDecl _ ident expr ann -> let qualifiedName = qualify (NonEmpty.singleton (identToString ident)) in do - exprValue <- expressionToIntM expr + expr' <- advanceStage localState' expr let decl = ExportedLocationDecl (metadata qualifiedName) - exprValue + (trueValue expr') insertDecl decl doReturn =<< LocationDecl @@ -355,7 +363,10 @@ advanceFiddleDecls localState decls = fmap (reverse . fst) $ do <*> pure ann ObjTypeDecl _ ident body ann -> let qualifiedName = qualify (NonEmpty.singleton (identToString ident)) - localState'' = modifyCurrentScopePath (pushScope (NonEmpty.singleton $ identToString ident)) localState' + localState'' = + modifyCurrentScopePath + (pushScope (NonEmpty.singleton $ identToString ident)) + localState' in do typeSize <- calculateTypeSize =<< resolveOrFail body let decl = @@ -373,7 +384,8 @@ advanceFiddleDecls localState decls = fmap (reverse . fst) $ do let qualifiedName = qualify (NonEmpty.singleton (identToString ident)) in do location <- resolveLocationExpression localState' loc - exportedType <- objTypeToExport localState' typ + typ' <- advanceStage localState' typ + exportedType <- objTypeToExport localState' typ' let decl = ExportedObjectDecl (metadata qualifiedName) @@ -385,7 +397,7 @@ advanceFiddleDecls localState decls = fmap (reverse . fst) $ do (qMd decl) ident <$> advanceStage localState' loc - <*> advanceStage localState' typ + <*> pure typ' <*> pure ann ) ([], localState) @@ -395,16 +407,16 @@ insertDecl :: (ExportableDecl d) => d -> M () insertDecl decl = modify $ \(GlobalState ui c) -> GlobalState (UnitInterface.insert decl ui) c -objTypeToExport :: LocalState -> ObjType Expanded F A -> M ReferencedObjectType +objTypeToExport :: LocalState -> ObjType Qualified F A -> M ReferencedObjectType objTypeToExport ls = \case ArrayObjType {arraySize = size, arrayObjType = objType} -> ArrayObjectType <$> objTypeToExport ls objType - <*> expressionToIntM size + <*> pure (trueValue size) ReferencedObjType {refName = n} -> do (full, _ :: ExportedTypeDecl) <- resolveOrFail =<< resolveName n ls case full of - (f:fs) -> return $ ReferencedObjectType (f :| fs) + (f : fs) -> return $ ReferencedObjectType (f :| fs) _ -> compilationFailure calculateTypeSize :: ObjTypeBody Expanded F A -> M (N Bytes) |