# RUN: %PYTHON %s | FileCheck %s from mlir.dialects import smt, arith from mlir.ir import Context, Location, Module, InsertionPoint, F32Type def run(f): print("\nTEST:", f.__name__) with Context(), Location.unknown(): module = Module.create() with InsertionPoint(module.body): f(module) print(module) assert module.operation.verify() # CHECK-LABEL: TEST: test_smoke @run def test_smoke(_module): true = smt.constant(True) false = smt.constant(False) # CHECK: smt.constant true # CHECK: smt.constant false # CHECK-LABEL: TEST: test_types @run def test_types(_module): bool_t = smt.bool_t() bitvector_t = smt.bv_t(5) # CHECK: !smt.bool print(bool_t) # CHECK: !smt.bv<5> print(bitvector_t) # CHECK-LABEL: TEST: test_solver_op @run def test_solver_op(_module): @smt.solver def foo1(): true = smt.constant(True) false = smt.constant(False) # CHECK: smt.solver() : () -> () { # CHECK: %true = smt.constant true # CHECK: %false = smt.constant false # CHECK: } f32 = F32Type.get() @smt.solver(results=[f32]) def foo2(): return arith.ConstantOp(f32, 1.0) # CHECK: %{{.*}} = smt.solver() : () -> f32 { # CHECK: %[[CST1:.*]] = arith.constant 1.000000e+00 : f32 # CHECK: smt.yield %[[CST1]] : f32 # CHECK: } two = arith.ConstantOp(f32, 2.0) # CHECK: %[[CST2:.*]] = arith.constant 2.000000e+00 : f32 print(two) @smt.solver(inputs=[two], results=[f32]) def foo3(z: f32): return z # CHECK: %{{.*}} = smt.solver(%[[CST2]]) : (f32) -> f32 { # CHECK: ^bb0(%[[ARG0:.*]]: f32): # CHECK: smt.yield %[[ARG0]] : f32 # CHECK: } # CHECK-LABEL: TEST: test_export_smtlib @run def test_export_smtlib(module): @smt.solver def foo1(): true = smt.constant(True) smt.assert_(true) query = smt.export_smtlib(module.operation) # CHECK: ; solver scope 0 # CHECK: (assert true) # CHECK: (reset) print(query)