Skip to content

Commit 10a0e57

Browse files
richmckeevercopybara-github
authored andcommitted
Get rid of ad hoc TIv1 use in VAST->DSLX for the purpose of invoking std::pow().
PiperOrigin-RevId: 811882215
1 parent 22a460b commit 10a0e57

File tree

5 files changed

+21
-54
lines changed

5 files changed

+21
-54
lines changed

xls/codegen/vast/BUILD

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,6 @@ cc_library(
207207
"//xls/dslx/frontend:scanner",
208208
"//xls/dslx/type_system:deduce",
209209
"//xls/dslx/type_system:deduce_ctx",
210-
"//xls/dslx/type_system:parametric_env",
211210
"//xls/dslx/type_system:type",
212211
"//xls/dslx/type_system:type_info",
213212
"//xls/dslx/type_system:typecheck_function",

xls/codegen/vast/dslx_builder.cc

Lines changed: 14 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@
5858
#include "xls/dslx/parse_and_typecheck.h"
5959
#include "xls/dslx/type_system/deduce.h"
6060
#include "xls/dslx/type_system/deduce_ctx.h"
61-
#include "xls/dslx/type_system/parametric_env.h"
6261
#include "xls/dslx/type_system/type.h"
6362
#include "xls/dslx/type_system/type_info.h"
6463
#include "xls/dslx/type_system/typecheck_function.h"
@@ -75,17 +74,6 @@
7574
namespace xls {
7675
namespace {
7776

78-
absl::StatusOr<bool> IsNegative(const dslx::InterpValue& value) {
79-
if (!value.IsSigned()) {
80-
return false;
81-
}
82-
XLS_ASSIGN_OR_RETURN(int64_t bit_count, value.GetBitCount());
83-
auto zero = dslx::InterpValue::MakeSBits(bit_count, 0);
84-
XLS_ASSIGN_OR_RETURN(auto lt_zero, value.Lt(zero));
85-
XLS_ASSIGN_OR_RETURN(int64_t lt_zero_bit_value, lt_zero.GetBitValueViaSign());
86-
return lt_zero_bit_value == 1;
87-
}
88-
8977
std::string GetTypeDefName(const dslx::TypeDefinition& type_def) {
9078
return absl::visit(Visitor{
9179
[&](const dslx::ColonRef* n) { return n->ToString(); },
@@ -462,56 +450,35 @@ dslx::Unop* DslxBuilder::HandleUnaryOperator(const dslx::Span& span,
462450
}
463451

464452
absl::StatusOr<dslx::Expr*> DslxBuilder::HandleIntegerExponentiation(
465-
const dslx::Span& span, dslx::Expr* lhs, dslx::Expr* rhs) {
466-
// TODO(b/330575305): 2022-03-16: Switch the model to deduce after
467-
// constructing a value instead of deducing immediately beforehand.
468-
XLS_RETURN_IF_ERROR(deduce_ctx().Deduce(lhs).status());
469-
XLS_RETURN_IF_ERROR(deduce_ctx().Deduce(rhs).status());
470-
XLS_ASSIGN_OR_RETURN(dslx::InterpValue lhs_value,
471-
InterpretExpr(import_data(), type_info(), lhs));
472-
if (!lhs_value.HasBits()) {
473-
return absl::InvalidArgumentError("pow() LHS isn't bits-typed.");
474-
}
475-
476-
XLS_ASSIGN_OR_RETURN(dslx::InterpValue rhs_value,
477-
InterpretExpr(import_data(), type_info(), rhs));
478-
if (!rhs_value.HasBits()) {
479-
return absl::InvalidArgumentError("pow() RHS isn't bits-typed.");
480-
}
481-
482-
XLS_ASSIGN_OR_RETURN(bool is_negative, IsNegative(rhs_value));
483-
if (is_negative) {
484-
return absl::InvalidArgumentError(absl::StrCat(
485-
"RHS of pow() cannot be negative: ", rhs_value.ToString()));
486-
}
487-
453+
const dslx::Span& span, dslx::Expr* lhs, dslx::Expr* rhs,
454+
verilog::Expression* vast_rhs) {
455+
XLS_ASSIGN_OR_RETURN(int64_t rhs_value,
456+
verilog::FoldEntireVastExpr(vast_rhs, vast_type_map_));
457+
if (rhs_value < 0) {
458+
return absl::InvalidArgumentError(
459+
absl::StrCat("RHS of pow() cannot be negative: ", rhs_value));
460+
}
461+
462+
XLS_ASSIGN_OR_RETURN(verilog::DataType * vast_rhs_type,
463+
GetVastDataType(vast_rhs));
464+
XLS_ASSIGN_OR_RETURN(int64_t rhs_bit_count,
465+
vast_rhs_type->FlatBitCountAsInt64());
488466
auto* element_type = module().Make<dslx::BuiltinTypeAnnotation>(
489467
span, dslx::BuiltinType::kUN,
490468
module().GetOrCreateBuiltinNameDef(dslx::BuiltinType::kUN));
491-
XLS_ASSIGN_OR_RETURN(int64_t rhs_bit_count, rhs_value.GetBitCount());
492469
auto* array_dim =
493470
module().Make<dslx::Number>(span, absl::StrCat(rhs_bit_count),
494471
dslx::NumberKind::kOther, /*type=*/nullptr);
495472
auto* new_rhs_type =
496473
module().Make<dslx::ArrayTypeAnnotation>(span, element_type, array_dim);
497474
rhs = module().Make<dslx::Cast>(span, rhs, new_rhs_type);
498475

499-
std::string power_fn = lhs_value.IsUBits() ? "upow" : "spow";
500476
XLS_ASSIGN_OR_RETURN(dslx::Import * std,
501477
GetOrImportModule(dslx::ImportTokens({"std"})));
502478
auto* colon_ref = module().Make<dslx::ColonRef>(
503-
span, module().Make<dslx::NameRef>(span, "std", &std->name_def()),
504-
power_fn);
479+
span, module().Make<dslx::NameRef>(span, "std", &std->name_def()), "pow");
505480
auto* invocation = module().Make<dslx::Invocation>(
506481
span, colon_ref, std::vector<dslx::Expr*>({lhs, rhs}));
507-
dslx::ParametricEnv parametric_env(
508-
absl::flat_hash_map<std::string, dslx::InterpValue>{
509-
{"N", dslx::InterpValue::MakeUBits(32, rhs_bit_count)}});
510-
XLS_RETURN_IF_ERROR(type_info().AddInvocationTypeInfo(
511-
*invocation, /*callee=*/nullptr, /*caller=*/nullptr,
512-
/*caller_env=*/deduce_ctx().GetCurrentParametricEnv(),
513-
/*callee_env=*/parametric_env,
514-
/*derived_type_info=*/nullptr));
515482
return invocation;
516483
}
517484

xls/codegen/vast/dslx_builder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,8 @@ class DslxBuilder {
156156
dslx::UnopKind unop_kind, dslx::Expr* arg);
157157

158158
absl::StatusOr<dslx::Expr*> HandleIntegerExponentiation(
159-
const dslx::Span& span, dslx::Expr* lhs, dslx::Expr* rhs);
159+
const dslx::Span& span, dslx::Expr* lhs, dslx::Expr* rhs,
160+
verilog::Expression* vast_rhs);
160161

161162
absl::StatusOr<dslx::Number*> HandleConstVal(
162163
const dslx::Span& span, const Bits& bits,

xls/codegen/vast/translate_vast_to_dslx.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,8 @@ class VastToDslxTranslator {
189189
kind = dslx::BinopKind::kDiv;
190190
break;
191191
case verilog::OperatorKind::kPower: {
192-
XLS_ASSIGN_OR_RETURN(
193-
result, dslx_builder_->HandleIntegerExponentiation(span, lhs, rhs));
192+
XLS_ASSIGN_OR_RETURN(result, dslx_builder_->HandleIntegerExponentiation(
193+
span, lhs, rhs, op->rhs()));
194194
break;
195195
}
196196
default:

xls/codegen/vast/translate_vast_to_dslx_test.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -920,8 +920,8 @@ pub const power = u16:0x3;
920920
921921
import std;
922922
923-
pub const upow_result = std::upow(upow_lhs, power);
924-
pub const spow_result = std::spow(spow_lhs, power) as u16;
923+
pub const upow_result = std::pow(upow_lhs, power);
924+
pub const spow_result = std::pow(spow_lhs, power) as u16;
925925
)";
926926

927927
XLS_EXPECT_VAST_TRANSLATION(f, kExpected);
@@ -1582,7 +1582,7 @@ pub type foo_t = bits[42];
15821582
15831583
import std;
15841584
1585-
pub const MiB = std::spow(s32:2, s32:20 as uN[32]) as u32;
1585+
pub const MiB = std::pow(s32:2, s32:20 as uN[32]) as u32;
15861586
pub const Value1 = foo_t:64 * MiB as foo_t;
15871587
pub const Value2 = foo_t:0x0;
15881588
)";

0 commit comments

Comments
 (0)