[Formal][PropertyAnnotation] Annotating IOG-based invariants#855
Conversation
… active fork in between
…t the first slot) edge case: As the MC is not part of the IOG, tokens "hidden" within MC are not accounted for
Mark slots as IOG-terminating, and annotate SMV with a single slot in that case Annotate entry slots Extract all slots and eager fork states from IOG Export invariant to SMV
pass "self" to module of the environment endOp is a terminating node
Jiahui17
left a comment
There was a problem hiding this comment.
Some cosmetic comments (looking into IOG.cpp and HandshakeAnnotateProperties.cpp now..
There was a problem hiding this comment.
maybe it is cleaner to add a new operation for this instead of adding more attributes...
| SmallVector<std::string> inputVariables; | ||
| inputVariables.push_back("self"); |
There was a problem hiding this comment.
// NOTE: self is ... (see page XX in the nuXmv user manual)
SmallVector<std::string> inputVariables = {"self"};
Jiahui17
left a comment
There was a problem hiding this comment.
Just realized that we already discussed the IOG part
|
|
New OP |
Instead of terminating IOGs with sinks, they are now terminated with dead buffers This way, the extra attribute that propagates through handshake -> hw -> python is no longer necessary
|
I created the new dead buffer operation instead of using an attribute of the sink operation. I am now doing the merge so that the CI runs |
|
Could you rebase the branch to main? |
| // consumed by sinks | ||
| bool syncOutput = false; | ||
|
|
||
| // Determines if the output is modelled as a dead buffer (i.e. accepts one |
There was a problem hiding this comment.
the output or all outputs? Technically we can choose whether to have a single output or multiple outputs
| namespace { | ||
| // This function finds appropriate fork sent states for the consecutive tokens | ||
| // invariant: Given the IOG and a set of paths from a start buffer to an end | ||
| // buffer, it determines all forks for which: |
There was a problem hiding this comment.
it determines the sent states of all forks?
| if (!iog.contains(forward)) { | ||
| continue; | ||
| } | ||
| Operation *next = forward.getUses().begin()->getOwner(); |
There was a problem hiding this comment.
maybe we can shorten this by one forward.getUsers().back() (not super sure now..)?
| #include "mlir/IR/BuiltinOps.h" | ||
|
|
||
| namespace dynamatic { | ||
| IOGPathSet::IOGPathSet(const IOG &iog, Operation *startA, Operation *endA) |
There was a problem hiding this comment.
remember to address the remark that I had earier (should this be a class method of IOG itself?)!
| // TODO: Handle LoadOp for MC slot | ||
| auto slots = loadOp.getInternalSlotStateNamers(); | ||
| auto *mcOp = loadOp.getAddressResult().getUses().begin()->getOwner(); | ||
| assert(mcOp); |
There was a problem hiding this comment.
if (!mcOp) {
op->emitError(...);
llvm::report_fatal_error();
}| // 1. The start buffer is the copied slot of the fork | ||
| // 2. The fork is part of a path from start to end along the IOG | ||
| std::vector<EagerForkSentNamer> findCopiedSents(const IOG &iog, | ||
| const IOGPathSet &pathSet) { |
There was a problem hiding this comment.
- The construction of IOGPathSet is actually essential to understanding how this algorithm works
- The struct IOGPathSet hides the info that pathSet.start == the start buffer
|
Good job, thanks! |

No description provided.