Skip to content

Commit 145799a

Browse files
grebecopybara-github
authored andcommitted
[xlscc] Reuse z3 IR translators.
Reusing z3 IR translators allows previous conversions to be reused, which provides significant savings as this translation is expensive. PiperOrigin-RevId: 678390950
1 parent c2d1801 commit 145799a

File tree

4 files changed

+31
-12
lines changed

4 files changed

+31
-12
lines changed

xls/contrib/xlscc/BUILD

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ cc_library(
120120
":xlscc_logging",
121121
"//xls/common:math_util",
122122
"//xls/common:stopwatch",
123+
"//xls/common/status:ret_check",
123124
"//xls/common/status:status_macros",
124125
"//xls/interpreter:ir_interpreter",
125126
"//xls/ir",
@@ -137,6 +138,7 @@ cc_library(
137138
"//xls/solvers:z3_ir_translator",
138139
"//xls/solvers:z3_utils",
139140
"@com_google_absl//absl/base",
141+
"@com_google_absl//absl/base:core_headers",
140142
"@com_google_absl//absl/container:btree",
141143
"@com_google_absl//absl/container:flat_hash_map",
142144
"@com_google_absl//absl/container:flat_hash_set",

xls/contrib/xlscc/translate_loops.cc

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -163,12 +163,8 @@ absl::Status Translator::GenerateIR_UnrolledLoop(bool always_first_iter,
163163
const clang::Stmt* body,
164164
clang::ASTContext& ctx,
165165
const xls::SourceInfo& loc) {
166-
XLS_ASSIGN_OR_RETURN(
167-
std::unique_ptr<xls::solvers::z3::IrTranslator> z3_translator_parent,
168-
xls::solvers::z3::IrTranslator::CreateAndTranslate(
169-
/*source=*/nullptr,
170-
/*allow_unsupported=*/false));
171-
166+
XLS_ASSIGN_OR_RETURN(xls::solvers::z3::IrTranslator * z3_translator_parent,
167+
GetZ3Translator(context().fb->function()));
172168
Z3_solver solver =
173169
xls::solvers::z3::CreateSolver(z3_translator_parent->ctx(), 1);
174170

xls/contrib/xlscc/translator.cc

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
#include "llvm/include/llvm/ADT/FloatingPointMode.h"
6969
#include "llvm/include/llvm/ADT/StringRef.h"
7070
#include "llvm/include/llvm/Support/raw_ostream.h"
71+
#include "xls/common/status/ret_check.h"
7172
#include "xls/common/status/status_macros.h"
7273
#include "xls/contrib/xlscc/cc_parser.h"
7374
#include "xls/contrib/xlscc/xlscc_logging.h"
@@ -5395,12 +5396,9 @@ absl::StatusOr<bool> Translator::BitMustBe(bool assert_value, xls::BValue& bval,
53955396

53965397
XLS_RETURN_IF_ERROR(ShortCircuitBVal(bval, loc));
53975398

5398-
XLS_ASSIGN_OR_RETURN(
5399-
std::unique_ptr<xls::solvers::z3::IrTranslator> z3_translator,
5400-
xls::solvers::z3::IrTranslator::CreateAndTranslate(
5401-
/*ctx=*/ctx,
5402-
/*source=*/bval.node(),
5403-
/*allow_unsupported=*/false));
5399+
XLS_ASSIGN_OR_RETURN(xls::solvers::z3::IrTranslator * z3_translator,
5400+
GetZ3Translator(bval.builder()->function()));
5401+
XLS_RETURN_IF_ERROR(bval.node()->Accept(z3_translator));
54045402

54055403
absl::Span<xls::Node*> positive_assumptions, negative_assumptions;
54065404
xls::Node* assumptions[] = {bval.node()};
@@ -6116,4 +6114,19 @@ absl::StatusOr<Pragma> Translator::FindPragmaForLoc(
61166114
return parser_->FindPragmaForLoc(ploc, ignore_label);
61176115
}
61186116

6117+
absl::StatusOr<xls::solvers::z3::IrTranslator*> Translator::GetZ3Translator(
6118+
xls::FunctionBase* func) {
6119+
XLS_RET_CHECK(!func->IsBlock());
6120+
auto [iter, inserted] = z3_translators_.insert({func, nullptr});
6121+
if (inserted) {
6122+
XLS_ASSIGN_OR_RETURN(
6123+
iter->second,
6124+
xls::solvers::z3::IrTranslator::CreateAndTranslate(
6125+
// Don't preemptively convert everything as this is expensive and we
6126+
// might get away with converting less.
6127+
/*function_base=*/nullptr, /*allow_unsupported=*/false));
6128+
}
6129+
return iter->second.get();
6130+
}
6131+
61196132
} // namespace xlscc

xls/contrib/xlscc/translator.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#include <utility>
3030
#include <vector>
3131

32+
#include "absl/base/attributes.h"
3233
#include "absl/container/btree_map.h"
3334
#include "absl/container/flat_hash_map.h"
3435
#include "absl/container/flat_hash_set.h"
@@ -2249,6 +2250,13 @@ class Translator {
22492250
}
22502251
clang::PresumedLoc GetPresumedLoc(const clang::Stmt& stmt);
22512252
clang::PresumedLoc GetPresumedLoc(const clang::Decl& decl);
2253+
2254+
absl::StatusOr<xls::solvers::z3::IrTranslator*> GetZ3Translator(
2255+
xls::FunctionBase* func) ABSL_ATTRIBUTE_LIFETIME_BOUND;
2256+
2257+
absl::flat_hash_map<xls::FunctionBase*,
2258+
std::unique_ptr<xls::solvers::z3::IrTranslator>>
2259+
z3_translators_;
22522260
};
22532261

22542262
} // namespace xlscc

0 commit comments

Comments
 (0)