Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: m-labs/artiq
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 3fbee2707bf2
Choose a base ref
...
head repository: m-labs/artiq
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 52102a1a79a2
Choose a head ref
  • 2 commits
  • 3 files changed
  • 1 contributor

Commits on Dec 18, 2015

  1. compiler.types: make TValue hashable.

    whitequark committed Dec 18, 2015
    Copy the full SHA
    f4b19fe View commit details
  2. Copy the full SHA
    52102a1 View commit details
Showing with 39 additions and 12 deletions.
  1. +3 −0 artiq/compiler/types.py
  2. +17 −11 artiq/coredevice/comm_generic.py
  3. +19 −1 artiq/test/coredevice/embedding.py
3 changes: 3 additions & 0 deletions artiq/compiler/types.py
Original file line number Diff line number Diff line change
@@ -491,6 +491,9 @@ def __eq__(self, other):
def __ne__(self, other):
return not (self == other)

def __hash__(self):
return hash(self.value)

class TDelay(Type):
"""
The type-level representation of IO delay.
28 changes: 17 additions & 11 deletions artiq/coredevice/comm_generic.py
Original file line number Diff line number Diff line change
@@ -294,6 +294,7 @@ def run(self):
logger.debug("running kernel")

_rpc_sentinel = object()
_rpc_undefined = object()

# See session.c:{send,receive}_rpc_value and llvm_ir_generator.py:_rpc_tag.
def _receive_rpc_value(self, object_map):
@@ -331,18 +332,23 @@ def _receive_rpc_value(self, object_map):
present = self._read_int8()
if present:
return self._receive_rpc_value(object_map)
else:
return self._rpc_undefined
elif tag == "O":
return object_map.retrieve(self._read_int32())
else:
raise IOError("Unknown RPC value tag: {}".format(repr(tag)))

def _receive_rpc_args(self, object_map):
def _receive_rpc_args(self, object_map, defaults):
args = []
while True:
value = self._receive_rpc_value(object_map)
if value is self._rpc_sentinel:
return args
args.append(value)
elif value is self._rpc_undefined:
args.append(defaults[len(args)])
else:
args.append(value)

def _skip_rpc_value(self, tags):
tag = tags.pop(0)
@@ -425,22 +431,22 @@ def check(cond, expected):
raise IOError("Unknown RPC value tag: {}".format(repr(tag)))

def _serve_rpc(self, object_map):
service = self._read_int32()
args = self._receive_rpc_args(object_map)
service_id = self._read_int32()
service = object_map.retrieve(service_id)
arguments = self._receive_rpc_args(object_map, service.__defaults__)
return_tags = self._read_bytes()
logger.debug("rpc service: %d %r -> %s", service, args, return_tags)
logger.debug("rpc service: [%d]%r %r -> %s", service_id, service, arguments, return_tags)

try:
result = object_map.retrieve(service)(*args)
logger.debug("rpc service: %d %r == %r", service, args, result)
result = service(*arguments)
logger.debug("rpc service: %d %r == %r", service_id, arguments, result)

self._write_header(_H2DMsgType.RPC_REPLY)
self._write_bytes(return_tags)
self._send_rpc_value(bytearray(return_tags), result, result,
object_map.retrieve(service))
self._send_rpc_value(bytearray(return_tags), result, result, service)
self._write_flush()
except core_language.ARTIQException as exn:
logger.debug("rpc service: %d %r ! %r", service, args, exn)
logger.debug("rpc service: %d %r ! %r", service_id, arguments, exn)

self._write_header(_H2DMsgType.RPC_EXCEPTION)
self._write_string(exn.name)
@@ -455,7 +461,7 @@ def _serve_rpc(self, object_map):

self._write_flush()
except Exception as exn:
logger.debug("rpc service: %d %r ! %r", service, args, exn)
logger.debug("rpc service: %d %r ! %r", service_id, arguments, exn)

self._write_header(_H2DMsgType.RPC_EXCEPTION)
self._write_string(type(exn).__name__)
20 changes: 19 additions & 1 deletion artiq/test/coredevice/embedding.py
Original file line number Diff line number Diff line change
@@ -10,7 +10,6 @@ def build(self):
def roundtrip(self, obj, fn):
fn(obj)


class RoundtripTest(ExperimentCase):
def assertRoundtrip(self, obj):
exp = self.create(Roundtrip)
@@ -41,3 +40,22 @@ def test_list(self):
def test_object(self):
obj = object()
self.assertRoundtrip(obj)


class DefaultArg(EnvExperiment):
def build(self):
self.setattr_device("core")

def test(self, foo=42) -> TInt32:
return foo

@kernel
def run(self, callback):
callback(self.test())

class DefaultArgTest(ExperimentCase):
def test_default_arg(self):
exp = self.create(DefaultArg)
def callback(value):
self.assertEqual(value, 42)
exp.run(callback)