From 81d72a845a199b5fa51bcfb0bad9158f7782d774 Mon Sep 17 00:00:00 2001 From: Robin Sommer Date: Fri, 9 Dec 2022 10:09:43 +0100 Subject: [PATCH] Port `port` ctor expression to new model. --- doc/autogen/types/port.rst | 4 ++++ hilti/toolchain/include/ast/operators/port.h | 10 ++++++++++ hilti/toolchain/src/compiler/codegen/operators.cc | 6 ++++++ hilti/toolchain/src/compiler/parser/parser.yy | 6 ++++-- hilti/toolchain/src/compiler/visitors/normalizer.cc | 6 ++++++ 5 files changed, 30 insertions(+), 2 deletions(-) diff --git a/doc/autogen/types/port.rst b/doc/autogen/types/port.rst index b12597cbc..23580a351 100644 --- a/doc/autogen/types/port.rst +++ b/doc/autogen/types/port.rst @@ -6,6 +6,10 @@ .. rubric:: Operators +.. spicy:operator:: port::Call port port(uint<16>, enum) + + Creates a port instance. + .. spicy:operator:: port::Equal bool t:port op:== t:port Compares two port values. diff --git a/hilti/toolchain/include/ast/operators/port.h b/hilti/toolchain/include/ast/operators/port.h index ad8dbe102..c1651f097 100644 --- a/hilti/toolchain/include/ast/operators/port.h +++ b/hilti/toolchain/include/ast/operators/port.h @@ -2,8 +2,12 @@ #pragma once +#include + #include #include +#include +#include #include namespace hilti::operator_ { @@ -11,6 +15,12 @@ namespace hilti::operator_ { STANDARD_OPERATOR_2(port, Equal, type::Bool(), type::Port(), type::Port(), "Compares two port values.") STANDARD_OPERATOR_2(port, Unequal, type::Bool(), type::Port(), type::Port(), "Compares two port values.") +BEGIN_KEYWORD_CTOR(port, Ctor, "port", type::Port(), "Creates a port instance.") + std::vector parameters() const { + return {{"port", hilti::type::UnsignedInteger(16)}, {"protocol", type::Enum(type::Wildcard())}}; + } +END_KEYWORD_CTOR + BEGIN_METHOD(port, Protocol) const auto& signature() const { static auto _signature = Signature{.self = type::Port(), diff --git a/hilti/toolchain/src/compiler/codegen/operators.cc b/hilti/toolchain/src/compiler/codegen/operators.cc index f44f51d1d..96e6b14f0 100644 --- a/hilti/toolchain/src/compiler/codegen/operators.cc +++ b/hilti/toolchain/src/compiler/codegen/operators.cc @@ -527,6 +527,12 @@ struct Visitor : hilti::visitor::PreOrder { result_t operator()(const operator_::port::Equal& n) { return binary(n, "=="); } result_t operator()(const operator_::port::Unequal& n) { return binary(n, "!="); } + + result_t operator()(const operator_::port::Ctor& n) { + auto args = tupleArguments(n, n.op1()); + return fmt("::hilti::rt::Port(%s, %s)", args[0], args[1]); + } + result_t operator()(const operator_::port::Protocol& n) { return fmt("%s.protocol()", op0(n)); } // Set diff --git a/hilti/toolchain/src/compiler/parser/parser.yy b/hilti/toolchain/src/compiler/parser/parser.yy index 6223c9bea..4c60958b8 100644 --- a/hilti/toolchain/src/compiler/parser/parser.yy +++ b/hilti/toolchain/src/compiler/parser/parser.yy @@ -792,7 +792,6 @@ expr_e : BEGIN_ '(' expr ')' { $$ = hilti::expression::Unres expr_f : ctor { $$ = hilti::expression::Ctor(std::move($1), __loc__); } | ctor_expr { $$ = std::move($1); } - | PORT '(' expr ',' expr ')' { $$ = hilti::builder::port(std::move($3), std::move($5), __loc__); } | '-' expr_g { $$ = hilti::expression::UnresolvedOperator(hilti::operator_::Kind::SignNeg, {std::move($2)}, __loc__); } | '[' expr FOR local_id IN expr ']' { $$ = hilti::expression::ListComprehension(std::move($6), std::move($2), std::move($4), {}, __loc__); } @@ -824,10 +823,12 @@ ctor : CBOOL { $$ = hilti::ctor::Bool($1, __ | CADDRESS '/' CUINTEGER { $$ = hilti::ctor::Network(hilti::ctor::Network::Value($1, $3), __loc__); } | CPORT { $$ = hilti::ctor::Port(hilti::ctor::Port::Value($1), __loc__); } + /* There are more here that we could move into ctor_expr and have them use namedCtor. + But not sure if that'd change much so leaving here for now. + */ | OPTIONAL '(' expr ')' { $$ = hilti::ctor::Optional(std::move($3), __loc__); } | DEFAULT type_param_begin type type_param_end '(' opt_exprs ')' { $$ = hilti::ctor::Default(std::move($3), std::move($6), __loc__); } - | list { $$ = std::move($1); } | map { $$ = std::move($1); } | regexp { $$ = std::move($1); } @@ -850,6 +851,7 @@ ctor_expr : INTERVAL '(' expr ')' { $$ = hilti::builder::namedCto | UINT16 '(' expr ')' { $$ = hilti::builder::namedCtor("uint16", { std::move($3) }, __loc__); } | UINT32 '(' expr ')' { $$ = hilti::builder::namedCtor("uint32", { std::move($3) }, __loc__); } | UINT64 '(' expr ')' { $$ = hilti::builder::namedCtor("uint64", { std::move($3) }, __loc__); } + | PORT '(' expr ',' expr ')' { $$ = hilti::builder::namedCtor("port", {std::move($3), std::move($5)}, __loc__); } ; tuple : '(' opt_tuple_elems1 ')' { $$ = hilti::ctor::Tuple(std::move($2), __loc__); } diff --git a/hilti/toolchain/src/compiler/visitors/normalizer.cc b/hilti/toolchain/src/compiler/visitors/normalizer.cc index 4be9a7eb9..bb2c0e439 100644 --- a/hilti/toolchain/src/compiler/visitors/normalizer.cc +++ b/hilti/toolchain/src/compiler/visitors/normalizer.cc @@ -212,6 +212,12 @@ struct VisitorNormalizer : public visitor::PreOrder { }); } + void operator()(const operator_::port::Ctor& op, position_t p) { + tryReplaceCtorExpression(op, p, [](const auto& ctor) { + return ctor::Port(ctor::Port::Value(ctor.value())); + }); + } + void operator()(const operator_::signed_integer::CtorSigned8& op, position_t p) { tryReplaceCtorExpression(op, p, [this, &p](const auto& ctor) { return ctor::SignedInteger(to_int64(ctor.value(), p), 8);