From da0d596946cf21e2f275dd03b40c0a6c0824f66b Mon Sep 17 00:00:00 2001 From: Josh Rahm Date: Fri, 11 Oct 2024 18:45:34 -0600 Subject: Change 'Expression' to use numbers with units. This helps to catch bugs in the compiler, specifically ones related to mixing up bits and bytes. --- src/Language/Fiddle/Compiler/Qualification.hs | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) (limited to 'src/Language/Fiddle/Compiler/Qualification.hs') diff --git a/src/Language/Fiddle/Compiler/Qualification.hs b/src/Language/Fiddle/Compiler/Qualification.hs index 70378c3..ce6250a 100644 --- a/src/Language/Fiddle/Compiler/Qualification.hs +++ b/src/Language/Fiddle/Compiler/Qualification.hs @@ -24,6 +24,7 @@ import Language.Fiddle.Compiler import Language.Fiddle.Compiler.ConsistencyCheck () import Language.Fiddle.Internal.Scopes import Language.Fiddle.Internal.UnitInterface as UnitInterface +import Language.Fiddle.Internal.UnitNumbers import Language.Fiddle.Types import Text.Printf (printf) @@ -113,7 +114,7 @@ deriving instance AdvanceStage S RegisterBitsDecl deriving instance AdvanceStage S ObjTypeDecl -deriving instance AdvanceStage S Expression +deriving instance AdvanceStage S (Expression u) instance AdvanceStage S RegisterBitsTypeRef where advanceStage localState = \case @@ -332,7 +333,7 @@ objTypeToExport ls = \case (full, _ :: ExportedTypeDecl) <- resolveOrFail =<< resolveName n ls return $ ReferencedObjectType (intercalate "." full) -calculateTypeSize :: ObjTypeBody Expanded F A -> M Word32 +calculateTypeSize :: ObjTypeBody Expanded F A -> M (N Bytes) calculateTypeSize (ObjTypeBody bodyType decls _) = ( case bodyType of Union {} -> maximum @@ -340,33 +341,33 @@ calculateTypeSize (ObjTypeBody bodyType decls _) = ) <$> mapM calculateDeclSize decls where - calculateDeclSize :: Directed ObjTypeDecl Expanded F A -> M Word32 + calculateDeclSize :: Directed ObjTypeDecl Expanded F A -> M (N Bytes) calculateDeclSize (undirected -> decl) = case decl of AssertPosStatement {} -> return 0 - RegisterDecl {regSize = size} -> expressionToIntM size - ReservedDecl {reservedExpr = size} -> expressionToIntM size + RegisterDecl {regSize = size} -> fst . bitsToBytes <$> expressionToIntM size + ReservedDecl {reservedExpr = size} -> fst . bitsToBytes <$> expressionToIntM size TypeSubStructure {subStructureBody = b} -> calculateTypeSize =<< resolveOrFail b -getBitTypeDeclaredSize :: BitType Expanded F A -> M Word32 +getBitTypeDeclaredSize :: BitType Expanded F A -> M (N Bits) getBitTypeDeclaredSize = \case (EnumBitType declaredSize _ _) -> expressionToIntM declaredSize (RawBits declaredSize _) -> expressionToIntM declaredSize resolveLocationExpression :: - (Integral i, Integral (NumberType stage)) => + (stage .< Expanded ~ False) => LocalState -> - Expression stage F A -> - M i + Expression u stage F A -> + M (N u) resolveLocationExpression ls (Var var _) = do (_, ExportedLocationDecl _ v) <- resolveOrFail =<< resolveName var ls return (fromIntegral v) resolveLocationExpression _ e = expressionToIntM e expressionToIntM :: - (Integral i, Integral (NumberType stage)) => - Expression stage f A -> - M i + (stage .< Expanded ~ False) => + Expression u stage f A -> + M (N u) expressionToIntM expr = resolveOrFail $ either -- cgit