[Speculation] Switch to automatic buffering and normal CI flow#923
[Speculation] Switch to automatic buffering and normal CI flow#923murphe67 wants to merge 12 commits into
Conversation
There was a problem hiding this comment.
This directory is for the old backend, right?
There was a problem hiding this comment.
Technically? The system for including type dependencies is very strange and this the method we currently use for the existing VHDL multi dimensional outputs in the current backend.
We should probably change it, but for right now this follows the existing protocol for adding a new type def.
| - Merge the two speculator units into a single speculator unit | ||
| - Add an additional buffer on commit control inputs, | ||
| which is needed due to the conditionally-present join in the commit unit | ||
| being unrepresentable to the buffering algorithm. |
There was a problem hiding this comment.
Why weren't they a single speculator unit to begin with?
There was a problem hiding this comment.
Hoping to actually put them back into one unit later by doing some kind of buffer characterizations for how output latencies are a function of input latencies.
Currently I think you figured it out that when we pass a single speculator unit to the MILP it thinks the predicted output is generated after the real input arrives.
But actually the predicted output is generated as soon as the trigger arrives, and the control outputs are generated when the real input arrives. So we split it into which outputs are caused by which inputs.
| }]; | ||
| } | ||
|
|
||
| def SpecPreBufferOp1 : Handshake_Op<"spec_prebuffer1", [ |
There was a problem hiding this comment.
Could it and Op2 have more descriptive names?
I initially thought that they were buffers, but they are actually two placeholders for letting the MILP to understand a speculator
There was a problem hiding this comment.
Yeah this is definitely a good suggestion, will do 😁
| let options = []; | ||
| } | ||
|
|
||
| def HandshakeSpecPostBuffer : DynamaticPass<"handshake-spec-post-buffer"> { |
There was a problem hiding this comment.
Should I call the name analysis stuff manually at the end of run on operation or do some pass manager stuff, do we have a agreed-on solution for this yet?
| for (handshake::LSQOp lsqOp : funcOp.getOps<handshake::LSQOp>()) | ||
| setLSQControlConstraints(lsqOp); | ||
|
|
||
| // The speculator has outputs which require buffers |
There was a problem hiding this comment.
could be a separate function like setLSQControlConstraints, to make the function body (setFPGA20Properties) look more balanced
There was a problem hiding this comment.
yeah agreed that it should be better encapsulated
Complete redo of speculator and save-commit RTL and communication between speculator and save-commit, as well as @shundroid's spec pre buffer units, to allow buffering using standard MILP approaches.
Further work: unit characterizations, fixing save-commit placement to avoid the single case of manual buffering, use of buffer characteristics to avoid pre buffer unit