blob: 46ee3536473b18d5a6ec54488479563b50b0a6aa (
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
|
================================================
========== ADAM's BIG ASS TODO LIST ============
================================================
Important things:
======== Update Core ==========
Change all primops to be strict on data widths
Update parser and update tests
on-reset
Add source locaters
Add Unit Tests for each pass
======== Check Passes ==========
Parser
Error if incorrectly assign stuff, like use = instead of :=
Well-formed high firrtl
Unique names per module
No name can be a prefix of any other name.
No nested modules
Only modules in circuit (no statements or expressions)
Cannot connect directly to a mem ever
Subfields are only on bundles, before type inference
Can only connect to a Ref or Subfield or Index
UInt only has positive ints
After adding dynamic assertions, insert bounds check with accessor expansion
Well-formed low firrtl
All things only assigned to once
======== Other Passes ========
======== Consultations ========
Stephen:
width equality
pin stephen on an example
======== Think About ========
naming for split nodes
subword accesses
annotation system
zero-width wires
on-reset
expanding mems (consider changing defmem to be size, and element type)
Make instances always male, flip the bundles on declaration
Multi-streams for print statements/asserts (Jack)
Consider def female node. (Patrick)
Talk to palmer/patrick about how writing passes is going to be supported
Figure out how widths propogate for all updated primops (Adam)
Add partial bulk connect (Scott, Stephen)
Add FIFOs to the IR (Palmer)
Think about supporting generic primops on bundles and vecs (Adam) (wait until front-end more completed)
======== Update Spec ========
Add Not to spec
add assertions and printfs
cannot connect directly to a mem (loc can never contain a mem)
Front-end needs to guarantee unique names per module.
FIRRTL rule: No name can be a prefix of any other name.
Future questions to address in spec:
Introduction – motivation, and intended usage
Philosophical justifications for all constructs
More introduction for types, e.g. what is a ground type?
What is a statement? What is an expression? What is a memory? Difference between vector type and memory? What are accessors for?
Why would I ever write an empty statement? Mainly for use by compiler/passes
What is a structural element? Duplication?
Subtracting two unsigned numbers… Should talk to a math guy to figure it out
What are shift left and shift right operations? HW doesn’t have these concepts. Need justification.
What is lowered form? What is it for?
======== Pass Ideas ==========
Bounds checks for accessors
Overflow checks for add/add-wrap
Check combinational
Fast C++ where wires/register/instances are predicated
======== FIRRTL++ =========
Variable size FIFOs
TruthTable node
Custom types? Parameterized Types?
======== Next Layer Components =======
Accelerator with config registers
Schedulable
Decouple
Nack
Scheduler
|