artiq/artiq/py2llvm/builtins.py

82 lines
1.7 KiB
Python
Raw Normal View History

"""
The :mod:`builtins` module contains the builtin Python and ARTIQ
types, such as int or float.
"""
from . import types
# Types
class TNone(types.TMono):
def __init__(self):
super().__init__("NoneType")
class TBool(types.TMono):
def __init__(self):
super().__init__("bool")
class TInt(types.TMono):
def __init__(self, width=None):
if width is None:
width = types.TVar()
super().__init__("int", {"width": width})
class TFloat(types.TMono):
def __init__(self):
super().__init__("float")
class TList(types.TMono):
def __init__(self, elt=None):
if elt is None:
elt = types.TVar()
super().__init__("list", {"elt": elt})
def fn_len():
return types.TBuiltin("len")
def fn_round():
return types.TBuiltin("round")
def fn_range():
return types.TBuiltin("range")
def fn_syscall():
return types.TBuiltin("syscall")
# Accessors
2015-06-14 17:07:13 +08:00
def is_none(typ):
return types.is_mono(typ, "NoneType")
def is_bool(typ):
return types.is_mono(typ, "bool")
2015-06-13 18:45:09 +08:00
def is_int(typ, width=None):
if width:
return types.is_mono(typ, "int", {"width": width})
else:
return types.is_mono(typ, "int")
2015-06-14 17:07:13 +08:00
def get_int_width(typ):
if is_int(typ):
2015-06-15 13:40:37 +08:00
return types.get_value(typ.find()["width"])
2015-06-14 17:07:13 +08:00
def is_float(typ):
return types.is_mono(typ, "float")
def is_numeric(typ):
2015-06-14 17:07:13 +08:00
typ = typ.find()
return isinstance(typ, types.TMono) and \
typ.name in ('int', 'float')
2015-06-14 17:07:13 +08:00
def is_list(typ, elt=None):
if elt:
return types.is_mono(typ, "list", {"elt": elt})
else:
return types.is_mono(typ, "list")
def is_collection(typ):
typ = typ.find()
return isinstance(typ, types.TTuple) or \
types.is_mono(typ, "list")