@@ -66,6 +66,8 @@ std::string TagToString(InterpValueTag tag) {
6666 return " token" ;
6767 case InterpValueTag::kChannelReference :
6868 return " channel_reference" ;
69+ case InterpValueTag::kTypeReference :
70+ return " type_reference" ;
6971 }
7072 return absl::StrFormat (" <invalid InterpValueTag(%d)>" ,
7173 static_cast <int64_t >(tag));
@@ -187,7 +189,8 @@ std::string InterpValue::ToString(bool humanize,
187189 tag_ == InterpValueTag::kSBits || tag_ == InterpValueTag::kTuple ||
188190 tag_ == InterpValueTag::kArray || tag_ == InterpValueTag::kEnum ||
189191 tag_ == InterpValueTag::kFunction || tag_ == InterpValueTag::kToken ||
190- tag_ == InterpValueTag::kChannelReference ) {
192+ tag_ == InterpValueTag::kChannelReference ||
193+ tag_ == InterpValueTag::kTypeReference ) {
191194 return result;
192195 }
193196 LOG (FATAL) << " Unhandled tag: " << tag_;
@@ -240,6 +243,8 @@ std::string InterpValue::ToStringInternal(bool humanize,
240243 GetChannelReferenceOrDie ().GetChannelId ().has_value ()
241244 ? absl::StrCat (*GetChannelReferenceOrDie ().GetChannelId ())
242245 : " none" );
246+ case InterpValueTag::kTypeReference :
247+ return std::get<TypeReference>(payload_).string ;
243248 }
244249 return " <INVALID>" ;
245250}
@@ -426,6 +431,7 @@ bool InterpValue::Eq(const InterpValue& other) const {
426431 // bit value can be used in any place an enum type is annotated.
427432 case InterpValueTag::kSBits :
428433 case InterpValueTag::kUBits :
434+ case InterpValueTag::kTypeReference :
429435 case InterpValueTag::kEnum : {
430436 return other.HasBits () && GetBitsOrDie () == other.GetBitsOrDie ();
431437 }
@@ -472,6 +478,7 @@ bool InterpValue::operator==(const InterpValue& rhs) const { return Eq(rhs); }
472478 }
473479 switch (lhs.tag_ ) {
474480 case InterpValueTag::kUBits :
481+ case InterpValueTag::kTypeReference :
475482 return MakeBool (ucmp (lhs.GetBitsOrDie (), rhs.GetBitsOrDie ()));
476483 case InterpValueTag::kSBits :
477484 return MakeBool (scmp (lhs.GetBitsOrDie (), rhs.GetBitsOrDie ()));
@@ -759,10 +766,20 @@ const Bits& InterpValue::GetBitsOrDie() const {
759766 if (std::holds_alternative<Bits>(payload_)) {
760767 return std::get<Bits>(payload_);
761768 }
769+ if (auto * ref = std::get_if<TypeReference>(&payload_)) {
770+ return ref->bits ;
771+ }
762772
763773 return std::get<EnumData>(payload_).value ;
764774}
765775
776+ absl::StatusOr<const TypeAnnotation*> InterpValue::GetTypeReference () const {
777+ if (std::holds_alternative<TypeReference>(payload_)) {
778+ return std::get<TypeReference>(payload_).annotation ;
779+ }
780+ return absl::InvalidArgumentError (" Value does not contain a type reference." );
781+ }
782+
766783absl::StatusOr<InterpValue::ChannelReference> InterpValue::GetChannelReference ()
767784 const {
768785 if (std::holds_alternative<ChannelReference>(payload_)) {
@@ -1031,6 +1048,10 @@ absl::StatusOr<xls::Value> InterpValue::ConvertToIr() const {
10311048 return absl::InvalidArgumentError (absl::StrFormat (
10321049 " Cannot convert channel-reference-typed values to IR." ));
10331050 }
1051+ case InterpValueTag::kTypeReference : {
1052+ return absl::InvalidArgumentError (
1053+ absl::StrFormat (" Cannot convert type-reference-typed values to IR." ));
1054+ }
10341055 }
10351056 LOG (FATAL) << " Unhandled tag: " << tag_;
10361057}
0 commit comments