aboutsummaryrefslogtreecommitdiff
path: root/spec/leftovers.txt
blob: 99e2156dd31074f7ecb40158239f81e08f3daa4c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
%\section{User Guide - Misc}
%
%The resulting instance has a bundle type, where the given module's ports are fields %and can be accessed using the subfield expression.
%The orientation of the {\em output} ports are {\em default}, and the orientation of %the {\em input} ports are {\em reverse}.
%An instance may be directly connected to another element, but it must be on the right-%hand side of the connect statement.
%
%The following example illustrates directly connecting an instance to a wire:
%
%{ \fontsize{11pt}{1.15em}\selectfont
%\[
%\begin{aligned}
%&\kw{extmodule} Queue \ \kws{:} \\
%&\quad \kw{input} clk  \ \kw{:} \kws{Clock} \\
%&\quad \kw{input} in   \ \kw{:} \kws{UInt$<$}16\kws{$>$} \\
%&\quad \kw{output} out \ \kw{:} \kws{UInt$<$}16\kws{$>$} \\
%&\kw{module} Top \ \kws{:} \\
%&\quad \kw{input} clk  \ \kw{:} \kws{Clock} \\
%&\quad \kw{inst} queue \ \kw{:} Queue \\
%&\quad \kw{wire} connect \ \kw{:} \bundleT{\kw{default} out \ \kw{:} \kws{UInt$<$}16\%kws{$>$},\kw{reverse} in \ \kw{:} \ \kws{UInt$<$}16\kws{$>$},\kw{reverse} clk \ \kw{:} %\ \kws{Clock}} \\
%&\quad connect \ \kw{$<$=} queue \\
%\end{aligned}
%\]
%}
%
%The output ports of an instance may only be connected from, e.g., the right-hand side %of a connect statement.
%Conversely, the input ports of an instance may only be connected to, e.g., the left-%hand side of a connect statement.
%
%The following example illustrates a proper use of creating instances with different %clock domains:
%
%{ \fontsize{11pt}{1.15em}\selectfont
%\[
%\begin{aligned}
%&\kw{extmodule} AsyncQueue \ \kws{:} \\
%&\quad \kw{input} clk1 \ \kw{:} \kws{Clock} \\
%&\quad \kw{input} clk2 \ \kw{:} \kws{Clock} \\
%&\quad \kw{input} in  \ \kw{:} \bundleT{\kw{default} data \ \kw{:} \kws{UInt$<$}16\kws{%$>$},\kw{reverse} ready \ \kw{:} \kws{UInt$<$}1\kws{$>$}} \\
%&\quad \kw{output} out  \ \kw{:} \bundleT{\kw{default} data \ \kw{:} \kws{UInt$<$}16\%kws{$>$},\kw{reverse} ready \ \kw{:} \kws{UInt$<$}1\kws{$>$}} \\
%&\kw{extmodule} Source \ \kws{:} \\
%&\quad \kw{input} clk \ \kw{:} \kws{Clock} \\
%&\quad \kw{output} packet  \ \kw{:} \bundleT{\kw{default} data \ \kw{:} \kws{UInt$<$}16%\kws{$>$},\kw{reverse} ready \ \kw{:} \kws{UInt$<$}1\kws{$>$}} \\
%&\kw{extmodule} Sink \ \kws{:} \\
%&\quad \kw{input} clk \ \kw{:} \kws{Clock} \\
%&\quad \kw{input} packet  \ \kw{:} \bundleT{\kw{default} data \ \kw{:} \kws{UInt$<$}16\%kws{$>$},\kw{reverse} ready \ \kw{:} \kws{UInt$<$}1\kws{$>$}} \\
%&\kw{module} TwoClock \ \kws{:} \\
%&\quad \kw{input} clk1 \ \kw{:} \kws{Clock} \\
%&\quad \kw{input} clk2 \ \kw{:} \kws{Clock} \\
%&\quad \kw{inst} src \ \kw{:} Source \\
%&\quad src.clk \ \kw{$<$=} clk1 \\
%&\quad \kw{inst} snk \ \kw{:} Sink \\
%&\quad snk.clk \ \kw{$<$=} clk2 \\
%&\quad \kw{inst} queue \ \kw{:} AsyncQueue \\
%&\quad queue.clk1 \ \kw{$<$=} clk1 \\
%&\quad queue.clk2 \ \kw{$<$=} clk2 \\
%&\quad queue.in \ \kw{$<$=} src.packet \\
%&\quad snk.packet \ \kw{$<$=} queue.out \\
%\end{aligned}
%\]
%}
%

%\section{Annotations - IN PROGRESS}
%Supporting annotations is a critical piece of FIRRTL, yet is a very difficult problem %to solve properly.
%We are in the experimental phase of supporting annotations, and our philosophy is %outlined below.
%It remains to be seen whether our philosophy is correct - if not, we will certainly %devise a new strategy.
%
%\begin{enumerate}[topsep=3pt,itemsep=-0.5ex,partopsep=1ex,parsep=1ex]
%\item Writing a correct circuit is difficult - avoid silent failures at all costs.
%\item If annotations are held in the graph, every pass must properly propagate all %possible annotations.
%\item A pass incorrectly propagating an annotation cannot be easily detected (silent %failure).
%\item If annotations are held in an exteral data structure mapping names to %annotations, the structure must updated after every pass.
%\item Incorrectly updating the structure will cause a mismatching of names between %circuit components and annotation entries, which is easily detected.
%\item Thus, we feel the ability to detect failure outweighs the additional burden on %annotation writers.
%\end{enumerate}

%To implement this philosophy, we encourage passes to either preserve names in the %graph, use simple algorithms to transform names, or provide a rename table after a pass%.
%The annotation writer then updates their data structure accordingly.

%\section{Concrete Syntax}\label{concrete}
%This section describes the text format for FIRRTL that is supported by the provided %readers and writers.
%
%\subsection*{Circuits and Modules}
%A circuit is specified the following way.
%\begin{verbatim}
%circuit name : (modules ...)
%\end{verbatim}
%Or by taking advantage of indentation structuring:
%\begin{verbatim}
%circuit name :
%   modules ...
%\end{verbatim}
%
%A module is specified the following way.
%\begin{verbatim}
%module name : (ports ... stmts ...)
%\end{verbatim}
%The module body consists of a sequence of ports followed immediately by a sequence of %statements.
%If there is more than one statement they are grouped into a statement group by the %parser. 
%By using indentation structuring:
%\begin{verbatim}
%module name :
%   ports ...
%   stmts ...
%\end{verbatim}
%
%The following shows an example of a simple module.
%\begin{verbatim}
%module mymodule :
%   input a: UInt<1>
%   output b: UInt<1>
%   clock clk: UInt<1>
%   b <= a
%\end{verbatim}
%
%\subsection*{Types}
%The unsigned and signed integer types are specified the following way.
%The following examples demonstrate an unsigned integer with known bit width, signed %integer with known bit width, an unsigned integer with unknown bit width, and signed %integer with unknown bit width.
%\begin{verbatim}
%UInt<42>
%SInt<42>
%UInt<?>
%SInt<?>
%\end{verbatim}
%
%The bundle type consists of a number of fields surrounded with braces.
%The following shows an example of a decoupled bundle type.
%Note that the commas are for clarity only and are not necessary.
%\begin{verbatim}
%{default data: UInt<10>,
% default valid: UInt<1>,
% reverse ready: UInt<1>} 
%\end{verbatim}
%
%The vector type is specified by immediately postfixing a type with a bracketed integer %literal.
%The following example demonstrates a ten-element vector of 16-bit unsigned integers.
%\begin{verbatim}
%UInt<16>[10]
%\end{verbatim}
%
%\subsection*{Statements}
%The following examples demonstrate declaring wires, registers, memories, nodes, %instances, poisons, and accessors.
%\begin{verbatim}
%wire mywire : UInt<10> 
%reg myreg : UInt<10>, clk, reset 
%cmem mycombmem : UInt<10>,16
%smem myseqmem : UInt<10>,16
%inst myinst : MyModule 
%poison mypoison : UInt<10> 
%infer accessor myaccessor = e[i],clk
%\end{verbatim}
%
%The connect statement is specified using the \verb|<=| operator.
%\begin{verbatim}
%x <= y
%\end{verbatim}
%
%The onreset connect statement is specified using the onreset keyword and the \verb|<=| %operator.
%\begin{verbatim}
%onreset x <= y 
%\end{verbatim}
%
%The partial connect statement is specified using the \verb|<-| operator.
%\begin{verbatim}
%x <- y 
%\end{verbatim}
%
%The assert statement is specified using the assert keyword.
%\begin{verbatim}
%assert x
%\end{verbatim}
%
%The conditional statement is specified with the \verb|when| keyword.
%\begin{verbatim}
%when x : x <= y else : x <= z
%\end{verbatim}
%Or by using indentation structuring:
%\begin{verbatim}
%when x :
%   x <= y
%else :
%   x <= z
%\end{verbatim}
%
%If there is no alternative branch specified, the parser will automatically insert an %empty statement.
%\begin{verbatim}
%when x :
%   x <= y
%\end{verbatim}
%
%For convenience when expressing nested conditional statements, the colon following the %\verb|else| keyword may be elided if the next statement is another conditional %statement.
%\begin{verbatim}
%when x :
%   x <= y
%else when y :
%   x <= z
%else :
%   x <= w
%\end{verbatim}
%
%\subsection*{Expressions}
%
%The UInt and SInt constructors create literal integers from a given value and bit width%.
%The following examples demonstrate creating literal integers of both known and unknown %bit width.
%\begin{verbatim}
%UInt<4>(42)
%SInt<4>(-42)
%UInt<?>(42)
%SInt<?>(-42)
%\end{verbatim}
%
%References are specified with an identifier.
%\begin{verbatim}
%x
%\end{verbatim}
%
%Subfields are expressed using the dot operator.
%\begin{verbatim}
%x.data
%\end{verbatim}
%
%Subindices are expressed using the \verb|[]| operator.
%\begin{verbatim}
%x[10]
%\end{verbatim}
%
%Primitive operations are expressed by following the name of the primitive with a list %containing the operands. 
%\begin{verbatim}
%add(x, y)
%add(x, add(x, y))
%shl(x, 42)
%\end{verbatim}


%\section{Future Plans}
%Some choices were made during the design of this specification which were %intentionally conservative, so that future versions could lift the restrictions if %suitable semantics and implementations are determined.
%By restricting this version and potentially lifting these restrictions in future %versions, all existing FIRRTL circuits will remain valid.
%
%The following design decisions could potentially be changed in future spec revisions:
%\begin{enumerate}[topsep=3pt,itemsep=-0.5ex,partopsep=1ex,parsep=1ex]
%\item Disallowing zero-width types
%\item Always expanding memories into smaller memories (if its type is a non-ground-type%)
%\item Not including a \kws{ROM} node
%\item Custom annotations are not held in FIRRTL nodes
%\item Not requiring that all names are unique
%\end{enumerate}
%
%\section{Questions and Answers}
%\begin{enumerate}[topsep=3pt,itemsep=-0.5ex,partopsep=1ex,parsep=1ex]
%\item Why are there three connect operators?
%Each is needed for a particular use case - the better question is why did we chose to %create multiple connect statements instead of other constructs.
%Statements, as opposed to expressions, are very restricted in how they nest.
%Thus, the desired supported behavior (partial connects, full connects, and resets) %will never be used in an arbitrary nested expression where the semantics would be %unintuitive.
%In addition, both the implementation and the user only needs to look at the single %statement to implement it.
%
%\item Aren't there a lot of idiosyncrasies in FIRRTL?
%The FIRRTL specification is an ongoing process, and as we push more code through it, %it is likely to change.
%In our opinion, the idiosyncrasies are necessary for a cohesive design (and all %languages have idiosyncrasies).
%It remains an unknown whether there are too many idiosyncrasies for frontend writers.
%Because the spec is not frozen, we can certainly adapt it if necessary.
%However, at this point, we just need to push more code through.
%
%\item Why have a separate construct for initializing a register?
%The problem is initializing a register with a vector/bundle type, where a subset of %the fields are initialized.
%If the initial value is kept with the declaration, we would need a new construct to %specify a subset of values of ALL (potentially) nested vector/bundle types.
%It makes much more sense to separate initialization from the declaration, and use %something like a <= to initialize the fields/vector sub-components of the register.
%The next question is why not just have users specify the initial value using their own %"when reset :" statement.
%This doesn't work because of last connect semantics - the user could easily clobber %their initialization when statement without knowing.
%Creating an onreset statement does two things: (1) specifies to the USER exactly what %the reset value will be for any sub-component of a register, (2) encapsulates the %reset value in a way that is easy for the implementation to special case it (so it %doesn't get clobbered).
%
%\item Why do operations allow inputs of differing widths? 
%We tried restricting widths, but it actually complicated width inference and made %supporting front-ends with more lax width restrictions very difficult.
%Because there is perfectly well defined semantics, we opted to allow differing widths.
%In line with the Linux "funnel" philosophy of being accepting with your inputs and %restrictive with your outputs.
%
%\item Why require all names unique?
%Passes usually need unique names, so there needs to be a renaming pass somewhere.
%Standardizing how names gets mangled requires a lot of thought, and we didn't feel %comfortable putting this into the spec at the moment and potentially regretting it %later.
%For now, names have to be unique, and it is the front-end's responsibility to do this.
%
%\item Why allow declaring components in when statements? 
%We want the important property that a module is just a box of components inside - for %any jumble of components, you can always lace them in the box, and it will preserve %the semantics.
%You need to declare wires inside whens - because generators could run within a when in %a front-end.
%You should always be able to pull them into a module if we want.
%Now its inconsistent if you can't declare registers in the scope.
%
%\item Why not just have LoFIRRTL?
%LoFIRRTL leaves out general when usage, vector and bundle types, and requires a single %connect.
%For performance backends, we will need to emit arrays and structs.
%If there is only a lowered circuit, we lose that ability.
%We cannot simply add vector/bundle types to LoFIRRTL as front-ends cannot easily %remove whens without removing the complex types as well.
%Instead, one will need the expressiveness in FIRRTL to write a performant backend %which does not need to operate on LoFIRRTL.
%
%\item Why the stop statement have no arguements?
%Like the enable for write-accessors, the lowering step will preserve the sequence of %when statements under which a simulation will stop.
%
%\item Why disallow zero-width wires? 
%Very tricky to get the semantics correct.
%On the todo list.
%
%\item Why not require default value for wires? Isn't this a SAT problem?
%We do the same thing that is done in Java, and is standard programming language %practice.
%
%\item Why did/didn't you include XXX primop?
%Up for debate.
%
%\item How do you support subword assignment?
%We decided to not support subword assignment directly, and instead require the user to %separate the subword assignment into a vector type. Then, the user uses the subindex %expression to assign to an element in the vector.
%
%\end{enumerate}