System.IO.Unsafe.unsafePerformIO $
normalizeType env ty
--- | Get the width of a SizedWord type
--- sized_word_len :: HscTypes.HscEnv -> Type.Type -> Int
--- sized_word_len env ty = eval_tfp_int env (sized_word_len_ty ty)
-
sized_word_len_ty :: Type.Type -> Type.Type
sized_word_len_ty ty = len
where
Nothing -> error $ "\nCoreTools.sized_word_len_ty: Not a sized word type: " ++ (pprString ty)
[len] = args
--- | Get the width of a SizedInt type
--- sized_int_len :: HscTypes.HscEnv -> Type.Type -> Int
--- sized_int_len env ty = eval_tfp_int env (sized_int_len_ty ty)
-
sized_int_len_ty :: Type.Type -> Type.Type
sized_int_len_ty ty = len
where
Nothing -> error $ "\nCoreTools.sized_int_len_ty: Not a sized int type: " ++ (pprString ty)
[len] = args
--- | Get the upperbound of a RangedWord type
--- ranged_word_bound :: HscTypes.HscEnv -> Type.Type -> Int
--- ranged_word_bound env ty = eval_tfp_int env (ranged_word_bound_ty ty)
-
ranged_word_bound_ty :: Type.Type -> Type.Type
ranged_word_bound_ty ty = len
where
Nothing -> error $ "\nCoreTools.ranged_word_bound_ty: Not a sized word type: " ++ (pprString ty)
[len] = args
--- | Evaluate a core Type representing type level int from the TypeLevel
--- library to a real int.
--- eval_type_level_int :: Type.Type -> Int
--- eval_type_level_int ty =
--- unsafeRunGhc $ do
--- -- Automatically import modules for any fully qualified identifiers
--- setDynFlag DynFlags.Opt_ImplicitImportQualified
---
--- let to_int_name = mkRdrName "Data.TypeLevel.Num.Sets" "toInt"
--- let to_int = SrcLoc.noLoc $ HsExpr.HsVar to_int_name
--- let undef = hsTypedUndef $ coreToHsType ty
--- let app = HsExpr.HsApp (to_int) (undef)
---
--- core <- toCore [] app
--- execCore core
-
--- | Get the length of a FSVec type
--- tfvec_len :: HscTypes.HscEnv -> Type.Type -> Int
--- tfvec_len env ty = eval_tfp_int env (tfvec_len_ty ty)
-
tfvec_len_ty :: Type.Type -> Type.Type
tfvec_len_ty ty = len
where
_ -> error $ "\nVHDL.mkConcSM: Not in normal form: Not a selector case:\n" ++ (pprString expr)
--- Multiple case alt are be conditional assignments and have only wild
+-- Multiple case alt become conditional assignments and have only wild
-- binders in the alts and only variables in the case values and a variable
-- for a scrutinee. We check the constructor of the second alt, since the
-- first is the default case, if there is any.
-
--- mkConcSm (bndr, (CoreSyn.Case (CoreSyn.Var scrut) b ty [(_, _, CoreSyn.Var false), (con, _, CoreSyn.Var true)])) = do
--- scrut' <- MonadState.lift tsType $ varToVHDLExpr scrut
--- altcon <- MonadState.lift tsType $ altconToVHDLExpr con
--- let cond_expr = scrut' AST.:=: altcon
--- true_expr <- MonadState.lift tsType $ varToVHDLExpr true
--- false_expr <- MonadState.lift tsType $ varToVHDLExpr false
--- return ([mkCondAssign (Left bndr) cond_expr true_expr false_expr], [])
-mkConcSm (bndr, (CoreSyn.Case (CoreSyn.Var scrut) _ _ (alt:alts))) = do --error "\nVHDL.mkConcSm: Not in normal form: Case statement with more than two alternatives"
+mkConcSm (bndr, (CoreSyn.Case (CoreSyn.Var scrut) _ _ (alt:alts))) = do
scrut' <- MonadState.lift tsType $ varToVHDLExpr scrut
-- Omit first condition, which is the default
altcons <- MonadState.lift tsType $ mapM (altconToVHDLExpr . (\(con,_,_) -> con)) alts
genSizedInt = genFromInteger
{-
+-- This function is useful for use with vectorTH, since that generates
+-- explicit references to the TFVec constructor (which is normally
+-- hidden). Below implementation is probably not current anymore, but
+-- kept here in case we start using vectorTH again.
-- | Generate a Builder for the builtin datacon TFVec
genTFVec :: BuiltinBuilder
genTFVec (Left res) f [Left (CoreSyn.Let (CoreSyn.Rec letBinders) letRes)] = do {