46 lines
1.2 KiB
Python
46 lines
1.2 KiB
Python
"""
|
|
Useful semantics "macro" instructions built on top of
|
|
the primitives.
|
|
"""
|
|
from __future__ import absolute_import
|
|
from cdsl.operands import Operand
|
|
from cdsl.typevar import TypeVar
|
|
from cdsl.instructions import Instruction, InstructionGroup
|
|
from base.types import b1
|
|
from base.immediates import imm64
|
|
from cdsl.ast import Var
|
|
from cdsl.xform import Rtl
|
|
from semantics.primitives import bv_from_imm64, bvite
|
|
import base.formats # noqa
|
|
|
|
GROUP = InstructionGroup("primitive_macros", "Semantic macros instruction set")
|
|
AnyBV = TypeVar('AnyBV', bitvecs=True, doc="")
|
|
x = Var('x')
|
|
y = Var('y')
|
|
imm = Var('imm')
|
|
a = Var('a')
|
|
|
|
#
|
|
# Bool-to-bv1
|
|
#
|
|
BV1 = TypeVar("BV1", bitvecs=(1, 1), doc="")
|
|
bv1_op = Operand('bv1_op', BV1, doc="")
|
|
cond_op = Operand("cond", b1, doc="")
|
|
bool2bv = Instruction(
|
|
'bool2bv', r"""Convert a b1 value to a 1-bit BV""",
|
|
ins=cond_op, outs=bv1_op)
|
|
|
|
v1 = Var('v1')
|
|
v2 = Var('v2')
|
|
bvone = Var('bvone')
|
|
bvzero = Var('bvzero')
|
|
bool2bv.set_semantics(
|
|
v1 << bool2bv(v2),
|
|
Rtl(
|
|
bvone << bv_from_imm64(imm64(1)),
|
|
bvzero << bv_from_imm64(imm64(0)),
|
|
v1 << bvite(v2, bvone, bvzero)
|
|
))
|
|
|
|
GROUP.close()
|