66#include " ir/state.h"
77#include " smt/solver.h"
88#include " util/compiler.h"
9+ #include " util/config.h"
910#include < array>
1011#include < cassert>
1112#include < numeric>
@@ -1089,12 +1090,26 @@ void ArrayType::print(ostream &os) const {
10891090}
10901091
10911092
1092- VectorType::VectorType (string &&name, unsigned elements, Type &elementTy)
1093- : AggregateType(std::move(name), false ) {
1094- assert (elements != 0 );
1095- this ->elements = elements;
1093+ expr VectorType::getVScaleVar () {
1094+ return expr::mkVar (" vscale" , var_vector_elements);
1095+ }
1096+
1097+ expr VectorType::vscale () const {
1098+ if (!scalable)
1099+ return expr::mkUInt (1 , var_vector_elements);
1100+ return defined ? expr::mkUInt (vscale_value, var_vector_elements)
1101+ : getVScaleVar ();
1102+ }
1103+
1104+ VectorType::VectorType (string &&name, unsigned elems, Type &elTy, bool scal)
1105+ : AggregateType(std::move(name), false ), scalable(scal), min_elements(elems),
1106+ vscale_value (scal ? util::config::vscale_value : 1 ) {
1107+ assert (elems != 0 );
1108+ if (scalable)
1109+ elems *= vscale_value;
1110+ this ->elements = elems;
10961111 defined = true ;
1097- children.resize (elements, &elementTy );
1112+ children.resize (elements, &elTy );
10981113 is_padding.resize (elements, false );
10991114}
11001115
@@ -1157,6 +1172,12 @@ expr VectorType::getTypeConstraints() const {
11571172 r &= numElements ().ugt (i).implies (elementTy == *children[i]);
11581173 }
11591174
1175+ if (scalable && defined ) {
1176+ r &= vscale () == expr::mkUInt (vscale_value, var_vector_elements);
1177+ } else if (scalable) {
1178+ r &= vscale ().uge (expr::mkUInt (1 , var_vector_elements));
1179+ }
1180+
11601181 return r;
11611182}
11621183
@@ -1172,14 +1193,25 @@ bool VectorType::isVectorType() const {
11721193 return true ;
11731194}
11741195
1196+ void VectorType::fixup (const Model &m) {
1197+ if (!defined && scalable)
1198+ vscale_value = m.getUInt (vscale ());
1199+ AggregateType::fixup (m);
1200+ }
1201+
11751202expr VectorType::enforceVectorType (
11761203 const function<expr(const Type&)> &enforceElem) const {
11771204 return enforceElem (*children[0 ]);
11781205}
11791206
11801207void VectorType::print (ostream &os) const {
1181- if (elements)
1182- os << ' <' << elements << " x " << *children[0 ] << ' >' ;
1208+ if (!elements)
1209+ return ;
1210+ os << ' <' ;
1211+ if (scalable) {
1212+ os << " vscale" << " :" << vscale_value << " x " ;
1213+ }
1214+ os << min_elements << " x " << *children[0 ] << ' >' ;
11831215}
11841216
11851217
0 commit comments