Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions xls/passes/visibility_analysis.cc
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include "xls/common/status/status_macros.h"
#include "xls/data_structures/binary_decision_diagram.h"
#include "xls/ir/bits.h"
#include "xls/ir/ir_annotator.h"
#include "xls/ir/node.h"
#include "xls/ir/nodes.h"
#include "xls/ir/op.h"
Expand Down Expand Up @@ -747,6 +748,17 @@ BddNodeIndex VisibilityAnalysis::ConservativeVisibilityByPruningEdges(
return bdd_query_engine_->bdd().one();
}

VisibilityAnnotator VisibilityAnalysis::annotator() const {
return VisibilityAnnotator(this);
}

Annotation VisibilityAnnotator::NodeAnnotation(Node* node) const {
return Annotation{
.suffix = absl::StrFormat(
"visible[%s]",
vis_->bdd_query_engine()->bdd().ToStringDnf(*vis_->GetInfo(node)))};
}

BddNodeIndex VisibilityAnalysis::VisibilityOfNearestPostDominator(
Node* node) const {
// If querying with exclusions, do not rely on the post dominator fallback
Expand Down
18 changes: 18 additions & 0 deletions xls/passes/visibility_analysis.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
#include "absl/types/span.h"
#include "xls/data_structures/binary_decision_diagram.h"
#include "xls/ir/change_listener.h"
#include "xls/ir/ir_annotator.h"
#include "xls/ir/node.h"
#include "xls/ir/nodes.h"
#include "xls/passes/bdd_evaluator.h"
Expand Down Expand Up @@ -178,6 +179,8 @@ class NodeImpactOnVisibilityAnalysis : public LazyNodeData<int64_t> {
}
};

class VisibilityAnnotator;

// The visibility of a node is the BDD expression that, if true, indicates that
// the node's value propagates outside of the function or proc.
//
Expand Down Expand Up @@ -228,6 +231,11 @@ class VisibilityAnalysis : public LazyNodeData<BddNodeIndex> {

BddNodeIndex VisibilityOfNearestPostDominator(Node* node) const;

const BddQueryEngine* bdd_query_engine() const { return bdd_query_engine_; }

// Get an annotator for the IR this analsysis is performed on.
VisibilityAnnotator annotator() const;

protected:
BddNodeIndex ComputeInfo(
Node* node,
Expand Down Expand Up @@ -331,6 +339,16 @@ class SingleSelectVisibilityAnalysis
void UserRemoved(Node* node, Node* user) override;
};

class VisibilityAnnotator : public IrAnnotator {
public:
VisibilityAnnotator(const VisibilityAnalysis* vis) : vis_(vis) {}

Annotation NodeAnnotation(Node* node) const override;

private:
const VisibilityAnalysis* vis_;
};

} // namespace xls

#endif // XLS_PASSES_VISIBILITY_ANALYSIS_H_
2 changes: 2 additions & 0 deletions xls/passes/visibility_analysis_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -797,6 +797,7 @@ TEST_F(VisibilityAnalysisTest, MutuallyExclusivePrioritySelectCases) {
XLS_ASSERT_OK_AND_ASSIGN(
auto visibility, VisibilityAnalysis::Create(&operand_visibility,
bdd_engine.get(), &post_dom));
RecordProperty("ir", f->DumpIr(visibility->annotator()));

EXPECT_TRUE(visibility->IsMutuallyExclusive(add.node(), sub.node()));
}
Expand Down Expand Up @@ -856,6 +857,7 @@ TEST_F(VisibilityAnalysisTest, StateUsedInPredicateIsVisible) {
auto visibility, VisibilityAnalysis::Create(&operand_visibility,
bdd_engine.get(), &post_dom));

RecordProperty("ir", f->DumpIr(visibility->annotator()));
auto pred_bdd_node = bdd_engine->GetBddNode(TreeBitLocation(pred.node(), 0));
ASSERT_TRUE(pred_bdd_node.has_value());
EXPECT_EQ(*visibility->GetInfo(input.node()), pred_bdd_node.value())
Expand Down
Loading