artiq/artiq/compiler/builtins.py

131 lines
2.9 KiB
Python
Raw Normal View History

"""
2015-06-24 16:46:15 +08:00
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})
2015-06-26 23:53:20 +08:00
class TRange(types.TMono):
def __init__(self, elt=None):
if elt is None:
elt = types.TVar()
super().__init__("range", {"elt": elt})
self.attributes = OrderedDict([
("start", elt),
("stop", elt),
("step", elt),
])
2015-06-26 23:53:20 +08:00
2015-06-29 03:48:15 +08:00
class TException(types.TMono):
def __init__(self):
super().__init__("Exception")
2015-06-26 16:16:08 +08:00
def fn_bool():
2015-06-29 03:40:57 +08:00
return types.TConstructor("bool")
2015-06-26 16:16:08 +08:00
def fn_int():
2015-06-29 03:40:57 +08:00
return types.TConstructor("int")
2015-06-26 16:16:08 +08:00
def fn_float():
2015-06-29 03:40:57 +08:00
return types.TConstructor("float")
2015-06-26 16:16:08 +08:00
def fn_list():
2015-06-29 03:40:57 +08:00
return types.TConstructor("list")
2015-06-26 16:16:08 +08:00
2015-06-29 03:48:15 +08:00
def fn_Exception():
return types.TExceptionConstructor("Exception")
2015-06-26 23:53:20 +08:00
def fn_range():
2015-06-29 03:40:57 +08:00
return types.TBuiltinFunction("range")
2015-06-26 23:53:20 +08:00
def fn_len():
2015-06-29 03:40:57 +08:00
return types.TBuiltinFunction("len")
def fn_round():
2015-06-29 03:40:57 +08:00
return types.TBuiltinFunction("round")
def fn_syscall():
2015-06-29 03:40:57 +08:00
return types.TBuiltinFunction("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):
2015-06-29 03:48:15 +08:00
if width is not None:
2015-06-13 18:45:09 +08:00
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):
2015-06-29 03:48:15 +08:00
if elt is not None:
2015-06-14 17:07:13 +08:00
return types.is_mono(typ, "list", {"elt": elt})
else:
return types.is_mono(typ, "list")
2015-06-26 23:53:20 +08:00
def is_range(typ, elt=None):
2015-06-29 03:48:15 +08:00
if elt is not None:
2015-06-26 23:53:20 +08:00
return types.is_mono(typ, "range", {"elt": elt})
else:
return types.is_mono(typ, "range")
def is_iterable(typ):
typ = typ.find()
return isinstance(typ, types.TMono) and \
typ.name in ('list', 'range')
def get_iterable_elt(typ):
if is_iterable(typ):
return typ.find()["elt"]
2015-06-14 17:07:13 +08:00
def is_collection(typ):
typ = typ.find()
return isinstance(typ, types.TTuple) or \
types.is_mono(typ, "list")
2015-06-24 16:46:15 +08:00
2015-07-04 09:16:37 +08:00
def is_mutable(typ):
return typ.fold(False, lambda accum, typ:
is_list(typ) or types.is_function(typ))