def _cvc4_type_to_type(self, type_): if type_.isBoolean(): return types.BOOL elif type_.isInteger(): return types.INT elif type_.isReal(): return types.REAL elif type_.isArray(): # Casting Type into ArrayType type_ = CVC4.ArrayType(type_) # Recursively convert the types of index and elem idx_type = self._cvc4_type_to_type(type_.getIndexType()) elem_type = self._cvc4_type_to_type(type_.getConstituentType()) return types.ArrayType(idx_type, elem_type) elif type_.isBitVector(): # Casting Type into BitVectorType type_ = CVC4.BitVectorType(type_) return types.BVType(type_.getSize()) elif type_.isFunction(): # Casting Type into FunctionType type_ = CVC4.FunctionType(type_) return_type = type_.getRangeType() param_types = tuple( self._cvc4_type_to_type(ty) for ty in type_.getArgTypes()) return types.FunctionType(return_type, param_types) else: raise NotImplementedError("Unsupported type: %s" % type_)
def nud(self, parser): idx_type = parser.expression() parser.expect(ExprComma, ",") el_type = parser.expression() parser.expect(CloseBrace, "}") if type(parser.token) == OpenPar: parser.advance() default = parser.expression() parser.expect(ClosePar, ")") return parser.mgr.Array(idx_type, default) else: return types.ArrayType(idx_type, el_type)
def _z3_to_type(self, sort): if sort.kind() == z3.Z3_BOOL_SORT: return types.BOOL elif sort.kind() == z3.Z3_INT_SORT: return types.INT elif sort.kind() == z3.Z3_REAL_SORT: return types.REAL elif sort.kind() == z3.Z3_ARRAY_SORT: return types.ArrayType(self._z3_to_type(sort.domain()), self._z3_to_type(sort.range())) elif sort.kind() == z3.Z3_BV_SORT: return types.BVType(sort.size()) else: raise NotImplementedError("Unsupported sort in conversion: %s" % sort)
def _convert_sort(self, sort): kind = sort.get_sort_kind() if kind is ss.sortkinds.ARRAY: Kt = self._convert_sort(sort.get_indexsort()) Vt = self._convert_sort(sort.get_elemsort()) return pysmt_types.ArrayType(Kt, Vt) elif kind is ss.sortkinds.BOOL: return pysmt_types.BOOL elif kind is ss.sortkinds.BV: return pysmt_types.BVType(sort.get_width()) elif kind is ss.sortkinds.FUNCTION: domain = [self._convert_sort(s) for s in sort.get_domain_sorts()] codomain = self._convert_sort(sort.get_codomain()) return pysmt_types.FunctionType(codomain, domain) elif kind is ss.sortkinds.INT: return pysmt_types.INT else: assert kind is ss.sortkinds.REAL return pysmt_types.REAL