@@ -11,11 +11,11 @@ import AST.PrettyPrint
1111import Text.PrettyPrint as P
1212
1313
14−data Declaration' port def var
14+data Declaration' wire def var
1515 = Definition def
1616 | Datatype String [String] [(String, [T.Type var])]
1717 | TypeAlias String [String] (T.Type var)
18− | Port port
18+ | Wire wire
1919 | Fixity Assoc Int String
2020
2121
@@ -23,34 +23,38 @@ data Assoc = L | N | R
2323 deriving (Eq)
2424
2525
26−data RawPort
26+data RawWire
2727 = InputAnnotation String T.RawType
2828 | OutputAnnotation String T.RawType
29− | OutputDef String Source.Expr
29+ | OutputDefinition String Source.Expr
30+ | LoopbackAnnotation String T.RawType
31+ | LoopbackDefinition String Source.Expr
3032
3133
32−data Port expr var
33− = Out String expr (T.Type var)
34− | In String (T.Type var)
34+data Wire expr var
35+ = Output String expr (T.Type var)
36+ | Input String (T.Type var)
37+ | Loopback String (Maybe expr) (T.Type var)
3538
3639
3740type SourceDecl =
38− Declaration' RawPort Source.Def Var.Raw
41+ Declaration' RawWire Source.Def Var.Raw
3942
4043
4144type ValidDecl =
42− Declaration' (Port Valid.Expr Var.Raw) Valid.Def Var.Raw
45+ Declaration' (Wire Valid.Expr Var.Raw) Valid.Def Var.Raw
4346
4447
4548type CanonicalDecl =
46− Declaration' (Port Canonical.Expr Var.Canonical) Canonical.Def Var.Canonical
49+ Declaration' (Wire Canonical.Expr Var.Canonical) Canonical.Def Var.Canonical
4750
4851
49−portName :: Port expr var -> String
50−portName port =
51− case port of
52− Out name _ _ -> name
53− In name _ -> name
52+wireName :: Wire expr var -> String
53+wireName wire =
54+ case wire of
55+ Input name _ -> name
56+ Output name _ _ -> name
57+ Loopback name _ _ -> name
5458
5559
5660assocToString :: Assoc -> String
@@ -82,8 +86,8 @@ instance Binary Assoc where
8286
8387-- PRETTY STRINGS
8488
85−instance (Pretty port, Pretty def, Pretty var, Var.ToString var) =>
86− Pretty (Declaration' port def var) where
89+instance (Pretty wire, Pretty def, Pretty var, Var.ToString var) =>
90+ Pretty (Declaration' wire def var) where
8791 pretty decl =
8892 case decl of
8993 Definition def -> pretty def
@@ -109,7 +113,7 @@ instance (Pretty port, Pretty def, Pretty var, Var.ToString var) =>
109113 name' =
110114 P.text name <+> P.hsep (map P.text tvars)
111115
112− Port port -> pretty port
116+ Wire wire -> pretty wire
113117
114118 Fixity assoc prec op ->
115119 P.text "infix" <> assoc' <+> P.int prec <+> P.text op
@@ -121,32 +125,48 @@ instance (Pretty port, Pretty def, Pretty var, Var.ToString var) =>
121125 R -> P.text "r"
122126
123127
124−instance Pretty RawPort where
125− pretty port =
126− case port of
128+instance Pretty RawWire where
129+ pretty wire =
130+ case wire of
127131 InputAnnotation name tipe ->
128− prettyPort "input" name ":" tipe
132+ prettyWire "input" name ":" tipe
129133
130134 OutputAnnotation name tipe ->
131− prettyPort "output" name ":" tipe
135+ prettyWire "output" name ":" tipe
132136
133− OutputDef name expr ->
134− prettyPort "output" name "=" expr
137+ OutputDefinition name expr ->
138+ prettyWire "output" name "=" expr
135139
140+ LoopbackAnnotation name tipe ->
141+ prettyWire "loopback" name ":" tipe
136142
137−instance (Pretty expr, Pretty var, Var.ToString var) => Pretty (Port expr var) where
138− pretty port =
139− case port of
140− In name tipe ->
141− prettyPort "input" name ":" tipe
143+ LoopbackDefinition name expr ->
144+ prettyWire "loopback" name "=" expr
142145
143− Out name expr tipe ->
146+
147+instance (Pretty expr, Pretty var, Var.ToString var) => Pretty (Wire expr var) where
148+ pretty wire =
149+ case wire of
150+ Input name tipe ->
151+ prettyWire "input" name ":" tipe
152+
153+ Output name expr tipe ->
154+ P.vcat
155+ [ prettyWire "output" name ":" tipe
156+ , prettyWire "output" name "=" expr
157+ ]
158+
159+ Loopback name maybeExpr tipe ->
144160 P.vcat
145− [ prettyPort "output" name ":" tipe
146− , prettyPort "output" name "=" expr
161+ [ prettyWire "loopback" name ":" tipe
162+ , case maybeExpr of
163+ Just expr ->
164+ prettyWire "loopback" name "=" expr
165+ Nothing ->
166+ P.empty
147167 ]
148−
149168
150−prettyPort :: (Pretty a) => String -> String -> String -> a -> Doc
151−prettyPort keyword name op e =
169+
170+prettyWire :: (Pretty a) => String -> String -> String -> a -> Doc
171+prettyWire keyword name op e =
152172 P.text keyword <+> P.text name <+> P.text op <+> pretty e