Skip to content

Commit 33a4c37

Browse files
committed
Refactor the names of data type and constructors to carry
`PrimName` values instead of just `Ident` and register their names in the naming environment so they participate in pretty printing name resolution.
1 parent e360dcc commit 33a4c37

File tree

25 files changed

+484
-346
lines changed

25 files changed

+484
-346
lines changed

cryptol-saw-core/src/Verifier/SAW/Cryptol.hs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1579,14 +1579,14 @@ asCryptolTypeValue v =
15791579
Right t2 <- asCryptolTypeValue v2
15801580
return (Right (C.tSeq (C.tNum n) t2))
15811581

1582-
SC.VDataType "Prelude.Stream" [SC.TValue v1] ->
1582+
SC.VDataType (primName -> "Prelude.Stream") [SC.TValue v1] [] ->
15831583
do Right t1 <- asCryptolTypeValue v1
15841584
return (Right (C.tSeq C.tInf t1))
15851585

1586-
SC.VDataType "Cryptol.Num" [] ->
1586+
SC.VDataType (primName -> "Cryptol.Num") [] [] ->
15871587
return (Left C.KNum)
15881588

1589-
SC.VDataType _ _ -> Nothing
1589+
SC.VDataType _ _ _ -> Nothing
15901590

15911591
SC.VUnitType -> return (Right (C.tTuple []))
15921592
SC.VPairType v1 v2 -> do

saw-core-aig/src/Verifier/SAW/Simulator/BitBlast.hs

+1-1
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ muxInt _ x y = if x == y then return x else fail $ "muxBVal: VInt " ++ show (x,
305305

306306
muxBExtra :: AIG.IsAIG l g => g s ->
307307
TValue (BitBlast (l s)) -> l s -> BExtra (l s) -> BExtra (l s) -> IO (BExtra (l s))
308-
muxBExtra be (VDataType "Prelude.Stream" [TValue tp]) c x y =
308+
muxBExtra be (VDataType (primName -> "Prelude.Stream") [TValue tp] []) c x y =
309309
do let f i = do xi <- lookupBStream (VExtra x) i
310310
yi <- lookupBStream (VExtra y) i
311311
muxBVal be tp c xi yi

saw-core-coq/src/Verifier/SAW/Translation/Coq/Term.hs

+5-8
Original file line numberDiff line numberDiff line change
@@ -203,10 +203,7 @@ flatTermFToExpr ::
203203
m Coq.Term
204204
flatTermFToExpr tf = -- traceFTermF "flatTermFToExpr" tf $
205205
case tf of
206-
Primitive (EC _ nmi _) ->
207-
case nmi of
208-
ModuleIdentifier i -> translateIdent i
209-
ImportedName{} -> errorTermM "Invalid name for saw-core primitive"
206+
Primitive pn -> translateIdent (primName pn)
210207
UnitValue -> pure (Coq.Var "tt")
211208
UnitType -> pure (Coq.Var "unit")
212209
PairValue x y -> Coq.App (Coq.Var "pair") <$> traverse translateTerm [x, y]
@@ -216,8 +213,8 @@ flatTermFToExpr tf = -- traceFTermF "flatTermFToExpr" tf $
216213
PairRight t ->
217214
Coq.App <$> pure (Coq.Var "SAWCoreScaffolding.snd") <*> traverse translateTerm [t]
218215
-- TODO: maybe have more customizable translation of data types
219-
DataTypeApp n is as -> translateIdentWithArgs n (is ++ as)
220-
CtorApp n is as -> translateIdentWithArgs n (is ++ as)
216+
DataTypeApp n is as -> translateIdentWithArgs (primName n) (is ++ as)
217+
CtorApp n is as -> translateIdentWithArgs (primName n) (is ++ as)
221218

222219
RecursorType _d _params motive motiveTy ->
223220
-- type of the motive looks like
@@ -237,15 +234,15 @@ flatTermFToExpr tf = -- traceFTermF "flatTermFToExpr" tf $
237234

238235
-- TODO: support this next!
239236
Recursor (CompiledRecursor d parameters motive _motiveTy eliminators elimOrder) ->
240-
do maybe_d_trans <- translateIdentToIdent d
237+
do maybe_d_trans <- translateIdentToIdent (primName d)
241238
rect_var <- case maybe_d_trans of
242239
Just i -> return $ Coq.Var (show i ++ "_rect")
243240
Nothing ->
244241
errorTermM ("Recursor for " ++ show d ++
245242
" cannot be translated because the datatype " ++
246243
"is mapped to an arbitrary Coq term")
247244

248-
let fnd c = case Map.lookup c eliminators of
245+
let fnd c = case Map.lookup (primVarIndex c) eliminators of
249246
Just (e,_ety) -> translateTerm e
250247
Nothing -> errorTermM
251248
("Recursor eliminator missing eliminator for constructor " ++ show c)

saw-core-sbv/src/Verifier/SAW/Simulator/SBV.hs

+3-3
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ import qualified Verifier.SAW.Simulator.Prims as Prims
6767
import Verifier.SAW.SATQuery
6868
import Verifier.SAW.SharedTerm
6969
import Verifier.SAW.Simulator.Value
70-
import Verifier.SAW.TypedAST (FieldName, identName, toShortName)
70+
import Verifier.SAW.TypedAST (FieldName, toShortName, identBaseName)
7171
import Verifier.SAW.FiniteValue
7272
(FirstOrderType(..), FirstOrderValue(..)
7373
, fovVec, firstOrderTypeOf, asFirstOrderType
@@ -272,7 +272,7 @@ flattenSValue nm v = do
272272
VIntMod n si -> return ([svRem si (svInteger KUnbounded (toInteger n))], "")
273273
VWord sw -> return (if intSizeOf sw > 0 then [sw] else [], "")
274274
VCtorApp i ps ts -> do (xss, ss) <- unzip <$> traverse (force >=> flattenSValue nm) (ps++ts)
275-
return (concat xss, "_" ++ identName i ++ concat ss)
275+
return (concat xss, "_" ++ (Text.unpack (identBaseName (primName i))) ++ concat ss)
276276
VNat n -> return ([], "_" ++ show n)
277277
TValue (suffixTValue -> Just s)
278278
-> return ([], s)
@@ -560,7 +560,7 @@ muxBVal :: TValue SBV -> SBool -> SValue -> SValue -> IO SValue
560560
muxBVal = Prims.muxValue prims
561561

562562
muxSbvExtra :: TValue SBV -> SBool -> SbvExtra -> SbvExtra -> IO SbvExtra
563-
muxSbvExtra (VDataType "Prelude.Stream" [TValue tp]) c x y =
563+
muxSbvExtra (VDataType (primName -> "Prelude.Stream") [TValue tp] []) c x y =
564564
do let f i = do xi <- lookupSbvExtra x i
565565
yi <- lookupSbvExtra y i
566566
muxBVal tp c xi yi

saw-core-what4/src/Verifier/SAW/Simulator/What4.hs

+7-5
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ import Verifier.SAW.SATQuery
8888
import Verifier.SAW.SharedTerm
8989
import Verifier.SAW.Simulator.Value
9090
import Verifier.SAW.FiniteValue (FirstOrderType(..), FirstOrderValue(..))
91-
import Verifier.SAW.TypedAST (FieldName, ModuleMap, identName, toShortName)
91+
import Verifier.SAW.TypedAST (FieldName, ModuleMap, toShortName, ctorPrimName, identBaseName)
9292

9393
-- what4
9494
import qualified What4.Expr.Builder as B
@@ -544,7 +544,7 @@ muxBVal sym = Prims.muxValue (prims sym)
544544

545545
muxWhat4Extra :: forall sym. Sym sym =>
546546
sym -> TValue (What4 sym) -> SBool sym -> What4Extra sym -> What4Extra sym -> IO (What4Extra sym)
547-
muxWhat4Extra sym (VDataType "Prelude.Stream" [TValue tp]) c x y =
547+
muxWhat4Extra sym (VDataType (primName -> "Prelude.Stream") [TValue tp] [] ) c x y =
548548
do let f i = do xi <- lookupSStream (VExtra x) i
549549
yi <- lookupSStream (VExtra y) i
550550
muxBVal sym tp c xi yi
@@ -849,7 +849,7 @@ applyUnintApp sym app0 v =
849849
VArray (SArray sa) -> return (extendUnintApp app0 sa (W.exprType sa))
850850
VWord ZBV -> return app0
851851
VCtorApp i ps xv -> foldM (applyUnintApp sym) app' =<< traverse force (ps++xv)
852-
where app' = suffixUnintApp ("_" ++ identName i) app0
852+
where app' = suffixUnintApp ("_" ++ (Text.unpack (identBaseName (primName i)))) app0
853853
VNat n -> return (suffixUnintApp ("_" ++ show n) app0)
854854
TValue (suffixTValue -> Just s)
855855
-> return (suffixUnintApp s app0)
@@ -1371,8 +1371,10 @@ mkArgTerm sc ty val =
13711371
return (ArgTermRecord (zip tags xs))
13721372

13731373
(_, VCtorApp i ps vv) ->
1374-
do xs <- traverse (termOfSValue sc <=< force) (ps ++ vv)
1375-
x <- scCtorApp sc i xs
1374+
do ctor <- scRequireCtor sc (primName i)
1375+
ps' <- traverse (termOfSValue sc <=< force) ps
1376+
vv' <- traverse (termOfSValue sc <=< force) vv
1377+
x <- scCtorAppParams sc (ctorPrimName ctor) ps' vv'
13761378
return (ArgTermConst x)
13771379

13781380
(_, TValue tval) ->

saw-core/src/Verifier/SAW/Conversion.hs

+10-7
Original file line numberDiff line numberDiff line change
@@ -265,15 +265,15 @@ asCtor :: ArgsMatchable v a => Ident -> v a -> Matcher a
265265
asCtor o = resolveArgs $ Matcher (Net.Atom (identText o)) match
266266
where match t = do
267267
CtorApp c params l <- R.asFTermF t
268-
guard (c == o)
268+
guard (o == primName c)
269269
return (params ++ l)
270270

271271
-- | Match a datatype.
272-
asDataType :: ArgsMatchable v a => Ident -> v a -> Matcher a
273-
asDataType o = resolveArgs $ Matcher (Net.Atom (identText o)) match
272+
asDataType :: ArgsMatchable v a => PrimName a -> v a -> Matcher a
273+
asDataType o = resolveArgs $ Matcher (Net.Atom (identText (primName o))) match
274274
where match t = do
275275
DataTypeApp dt params l <- R.asFTermF t
276-
guard (dt == o)
276+
guard (primVarIndex dt == primVarIndex o)
277277
return (params ++ l)
278278

279279
-- | Match any sort.
@@ -400,14 +400,17 @@ mkTupleSelector i t
400400
| i > 1 = mkTermF (FTermF (PairRight t)) >>= mkTupleSelector (i - 1)
401401
| otherwise = panic "Verifier.SAW.Conversion.mkTupleSelector" ["non-positive index:", show i]
402402

403-
mkCtor :: Ident -> [TermBuilder Term] -> [TermBuilder Term] -> TermBuilder Term
403+
mkCtor :: PrimName Term -> [TermBuilder Term] -> [TermBuilder Term] -> TermBuilder Term
404404
mkCtor i paramsB argsB =
405405
do params <- sequence paramsB
406406
args <- sequence argsB
407407
mkTermF $ FTermF $ CtorApp i params args
408408

409-
mkDataType :: Ident -> [TermBuilder Term] -> [TermBuilder Term] ->
410-
TermBuilder Term
409+
mkDataType ::
410+
PrimName Term ->
411+
[TermBuilder Term] ->
412+
[TermBuilder Term] ->
413+
TermBuilder Term
411414
mkDataType i paramsB argsB =
412415
do params <- sequence paramsB
413416
args <- sequence argsB

saw-core/src/Verifier/SAW/ExternalFormat.hs

+81-34
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{-# LANGUAGE CPP #-}
2+
{-# LANGUAGE LambdaCase #-}
23
{-# LANGUAGE PatternGuards #-}
34
{-# LANGUAGE ScopedTypeVariables #-}
45
{-# LANGUAGE ViewPatterns #-}
@@ -29,6 +30,7 @@ import qualified Data.Vector as V
2930
import Text.Read (readMaybe)
3031
import Text.URI
3132

33+
import Verifier.SAW.Name
3234
import Verifier.SAW.SharedTerm
3335
import Verifier.SAW.TypedAST
3436

@@ -101,6 +103,11 @@ scWriteExternal t0 =
101103
do (m, nms, lns, x) <- State.get
102104
State.put (m, Map.insert (ecVarIndex ec) (ecName ec) nms, lns, x)
103105

106+
stashPrimName :: PrimName Int -> WriteM ()
107+
stashPrimName pn =
108+
do (m, nms, lns, x) <- State.get
109+
State.put (m, Map.insert (primVarIndex pn) (ModuleIdentifier (primName pn)) nms, lns, x)
110+
104111
go :: Term -> WriteM Int
105112
go (Unshared tf) = do
106113
tf' <- traverse go tf
@@ -133,28 +140,38 @@ scWriteExternal t0 =
133140
FTermF ftf ->
134141
case ftf of
135142
Primitive ec ->
136-
do stashName ec
137-
pure $ unwords ["Primitive", show (ecVarIndex ec), show (ecType ec)]
143+
do stashPrimName ec
144+
pure $ unwords ["Primitive", show (primVarIndex ec), show (primType ec)]
138145
UnitValue -> pure $ unwords ["Unit"]
139146
UnitType -> pure $ unwords ["UnitT"]
140147
PairValue x y -> pure $ unwords ["Pair", show x, show y]
141148
PairType x y -> pure $ unwords ["PairT", show x, show y]
142149
PairLeft e -> pure $ unwords ["ProjL", show e]
143150
PairRight e -> pure $ unwords ["ProjR", show e]
144-
CtorApp i ps es -> pure $
145-
unwords ("Ctor" : show i : map show ps ++ argsep : map show es)
146-
DataTypeApp i ps es -> pure $
147-
unwords ("Data" : show i : map show ps ++ argsep : map show es)
151+
CtorApp i ps es ->
152+
do stashPrimName i
153+
pure $ unwords ("Ctor" : show (primVarIndex i) : show (primType i) :
154+
map show ps ++ argsep : map show es)
155+
DataTypeApp i ps es ->
156+
do stashPrimName i
157+
pure $ unwords ("Data" : show (primVarIndex i) : show (primType i) :
158+
map show ps ++ argsep : map show es)
148159

149-
RecursorType d ps motive motive_ty -> pure $
150-
unwords (["RecursorType", show d] ++
160+
RecursorType d ps motive motive_ty ->
161+
do stashPrimName d
162+
pure $ unwords
163+
(["RecursorType", show (primVarIndex d), show (primType d)] ++
164+
map show ps ++
165+
[argsep, show motive, show motive_ty])
166+
Recursor (CompiledRecursor d ps motive motive_ty cs_fs ctorOrder) ->
167+
do stashPrimName d
168+
mapM_ stashPrimName ctorOrder
169+
pure $ unwords
170+
(["Recursor" , show (primVarIndex d), show (primType d)] ++
151171
map show ps ++
152-
[argsep, show motive, show motive_ty])
153-
Recursor (CompiledRecursor i ps motive motive_ty cs_fs ctorOrder) -> pure $
154-
unwords (["Recursor" , show i] ++ map show ps ++
155172
[ argsep, show motive, show motive_ty
156173
, show (Map.toList cs_fs)
157-
, show ctorOrder
174+
, show (map (\ec -> (primVarIndex ec, primType ec)) ctorOrder)
158175
])
159176
RecursorApp rec ixs e -> pure $
160177
unwords (["RecursorApp", show rec] ++
@@ -219,29 +236,57 @@ scReadExternal sc input =
219236
readIdx :: String -> ReadM Term
220237
readIdx tok = getTerm =<< readM tok
221238

222-
readElimsMap :: String -> ReadM (Map Ident (Term,Term))
239+
readElimsMap :: String -> ReadM (Map VarIndex (Term,Term))
223240
readElimsMap str =
224-
do (ls :: [(Ident,(Int,Int))]) <- readM str
241+
do (ls :: [(VarIndex,(Int,Int))]) <- readM str
225242
elims <- forM ls (\(c,(e,ty)) ->
226243
do e' <- getTerm e
227244
ty' <- getTerm ty
228245
pure (c, (e',ty')))
229246
pure (Map.fromList elims)
230247

248+
readCtorList :: String -> ReadM [PrimName Term]
249+
readCtorList str =
250+
do (ls :: [(VarIndex,Int)]) <- readM str
251+
forM ls (\(vi,i) -> readPrimName' vi =<< getTerm i)
252+
253+
readPrimName' :: VarIndex -> Term -> ReadM (PrimName Term)
254+
readPrimName' vi t' =
255+
do EC _ nmi tp <- readEC' vi t'
256+
case nmi of
257+
ModuleIdentifier ident -> pure (PrimName vi ident tp)
258+
_ -> lift $ fail $ "scReadExternal: primitive name must be a module identifier" ++ show nmi
259+
260+
readEC' :: VarIndex -> Term -> ReadM (ExtCns Term)
261+
readEC' vi t' =
262+
do (ts, nms, vs) <- State.get
263+
nmi <- case Map.lookup vi nms of
264+
Just nmi -> pure nmi
265+
Nothing -> lift $ fail $ "scReadExternal: ExtCns missing name info: " ++ show vi
266+
case nmi of
267+
ModuleIdentifier ident ->
268+
lift (scResolveNameByURI sc (moduleIdentToURI ident)) >>= \case
269+
Just vi' -> pure (EC vi' nmi t')
270+
Nothing -> lift $ fail $ "scReadExternal: missing module identifier: " ++ show ident
271+
_ ->
272+
case Map.lookup vi vs of
273+
Just vi' -> pure $ EC vi' nmi t'
274+
Nothing ->
275+
do vi' <- lift $ scFreshGlobalVar sc
276+
State.put (ts, nms, Map.insert vi vi' vs)
277+
pure $ EC vi' nmi t'
278+
231279
readEC :: String -> String -> ReadM (ExtCns Term)
232280
readEC i t =
233281
do vi <- readM i
234282
t' <- readIdx t
235-
(ts, nms, vs) <- State.get
236-
nmi <- case Map.lookup vi nms of
237-
Just nmi -> pure nmi
238-
Nothing -> lift $ fail $ "scReadExternal: ExtCns missing name info: " ++ show vi
239-
case Map.lookup vi vs of
240-
Just vi' -> pure $ EC vi' nmi t'
241-
Nothing ->
242-
do vi' <- lift $ scFreshGlobalVar sc
243-
State.put (ts, nms, Map.insert vi vi' vs)
244-
pure $ EC vi' nmi t'
283+
readEC' vi t'
284+
285+
readPrimName :: String -> String -> ReadM (PrimName Term)
286+
readPrimName i t =
287+
do vi <- readM i
288+
t' <- readIdx t
289+
readPrimName' vi t'
245290

246291
parse :: [String] -> ReadM (TermF Term)
247292
parse tokens =
@@ -251,35 +296,37 @@ scReadExternal sc input =
251296
["Pi", s, t, e] -> Pi (Text.pack s) <$> readIdx t <*> readIdx e
252297
["Var", i] -> pure $ LocalVar (read i)
253298
["Constant",i,t,e] -> Constant <$> readEC i t <*> readIdx e
254-
["Primitive", i, t] -> FTermF <$> (Primitive <$> readEC i t)
299+
["Primitive", i, t] -> FTermF <$> (Primitive <$> readPrimName i t)
255300
["Unit"] -> pure $ FTermF UnitValue
256301
["UnitT"] -> pure $ FTermF UnitType
257302
["Pair", x, y] -> FTermF <$> (PairValue <$> readIdx x <*> readIdx y)
258303
["PairT", x, y] -> FTermF <$> (PairType <$> readIdx x <*> readIdx y)
259304
["ProjL", x] -> FTermF <$> (PairLeft <$> readIdx x)
260305
["ProjR", x] -> FTermF <$> (PairRight <$> readIdx x)
261-
("Ctor" : i : (separateArgs -> Just (ps, es))) ->
262-
FTermF <$> (CtorApp (parseIdent i) <$> traverse readIdx ps <*> traverse readIdx es)
263-
("Data" : i : (separateArgs -> Just (ps, es))) ->
264-
FTermF <$> (DataTypeApp (parseIdent i) <$> traverse readIdx ps <*> traverse readIdx es)
306+
("Ctor" : i : t : (separateArgs -> Just (ps, es))) ->
307+
FTermF <$> (CtorApp <$> readPrimName i t <*> traverse readIdx ps <*> traverse readIdx es)
308+
("Data" : i : t : (separateArgs -> Just (ps, es))) ->
309+
FTermF <$> (DataTypeApp <$> readPrimName i t <*> traverse readIdx ps <*> traverse readIdx es)
265310

266-
("RecursorType" : i :
311+
("RecursorType" : i : t :
267312
(separateArgs ->
268313
Just (ps, [motive,motive_ty]))) ->
269-
do tp <- RecursorType (parseIdent i) <$>
314+
do tp <- RecursorType <$>
315+
readPrimName i t <*>
270316
traverse readIdx ps <*>
271317
readIdx motive <*>
272318
readIdx motive_ty
273319
pure (FTermF tp)
274-
("Recursor" : i :
320+
("Recursor" : i : t :
275321
(separateArgs ->
276322
Just (ps, [motive, motiveTy, elims, ctorOrder]))) ->
277-
do rec <- CompiledRecursor (parseIdent i) <$>
323+
do rec <- CompiledRecursor <$>
324+
readPrimName i t <*>
278325
traverse readIdx ps <*>
279326
readIdx motive <*>
280327
readIdx motiveTy <*>
281328
readElimsMap elims <*>
282-
readM ctorOrder
329+
readCtorList ctorOrder
283330
pure (FTermF (Recursor rec))
284331
("RecursorApp" : rec : (splitLast -> Just (ixs, arg))) ->
285332
do app <- RecursorApp <$>

0 commit comments

Comments
 (0)