2016-07-06 12:44:21 +08:00
|
|
|
import numpy
|
2016-04-26 09:31:17 +08:00
|
|
|
from time import sleep
|
|
|
|
|
2016-01-26 06:49:08 +08:00
|
|
|
from artiq.experiment import *
|
2015-08-28 18:24:57 +08:00
|
|
|
from artiq.test.hardware_testbench import ExperimentCase
|
|
|
|
|
2015-12-16 19:45:57 +08:00
|
|
|
|
2016-01-08 02:29:35 +08:00
|
|
|
class _Roundtrip(EnvExperiment):
|
2015-08-28 18:24:57 +08:00
|
|
|
def build(self):
|
2015-12-16 19:45:57 +08:00
|
|
|
self.setattr_device("core")
|
2015-08-28 18:24:57 +08:00
|
|
|
|
|
|
|
@kernel
|
|
|
|
def roundtrip(self, obj, fn):
|
|
|
|
fn(obj)
|
|
|
|
|
2016-06-29 02:37:39 +08:00
|
|
|
|
2015-08-28 18:24:57 +08:00
|
|
|
class RoundtripTest(ExperimentCase):
|
|
|
|
def assertRoundtrip(self, obj):
|
2016-01-08 02:29:35 +08:00
|
|
|
exp = self.create(_Roundtrip)
|
2015-09-01 22:38:38 +08:00
|
|
|
def callback(objcopy):
|
2015-08-28 18:24:57 +08:00
|
|
|
self.assertEqual(obj, objcopy)
|
|
|
|
exp.roundtrip(obj, callback)
|
|
|
|
|
|
|
|
def test_None(self):
|
|
|
|
self.assertRoundtrip(None)
|
|
|
|
|
|
|
|
def test_bool(self):
|
|
|
|
self.assertRoundtrip(True)
|
|
|
|
self.assertRoundtrip(False)
|
|
|
|
|
|
|
|
def test_int(self):
|
2016-07-06 12:44:21 +08:00
|
|
|
self.assertRoundtrip(numpy.int32(42))
|
|
|
|
self.assertRoundtrip(numpy.int64(42))
|
2015-08-28 18:24:57 +08:00
|
|
|
|
|
|
|
def test_float(self):
|
|
|
|
self.assertRoundtrip(42.0)
|
|
|
|
|
|
|
|
def test_str(self):
|
|
|
|
self.assertRoundtrip("foo")
|
|
|
|
|
|
|
|
def test_list(self):
|
|
|
|
self.assertRoundtrip([10])
|
|
|
|
|
2016-07-06 17:51:57 +08:00
|
|
|
def test_array(self):
|
|
|
|
self.assertRoundtrip(numpy.array([10]))
|
|
|
|
|
2015-08-28 18:24:57 +08:00
|
|
|
def test_object(self):
|
|
|
|
obj = object()
|
|
|
|
self.assertRoundtrip(obj)
|
2015-12-18 18:03:07 +08:00
|
|
|
|
2016-07-07 20:40:50 +08:00
|
|
|
def test_object_list(self):
|
|
|
|
self.assertRoundtrip([object(), object()])
|
|
|
|
|
2015-12-18 18:03:07 +08:00
|
|
|
|
2016-01-08 02:29:35 +08:00
|
|
|
class _DefaultArg(EnvExperiment):
|
2015-12-18 18:03:07 +08:00
|
|
|
def build(self):
|
|
|
|
self.setattr_device("core")
|
|
|
|
|
|
|
|
def test(self, foo=42) -> TInt32:
|
|
|
|
return foo
|
|
|
|
|
|
|
|
@kernel
|
2015-12-19 05:26:18 +08:00
|
|
|
def run(self):
|
|
|
|
return self.test()
|
2015-12-18 18:03:07 +08:00
|
|
|
|
2016-06-29 02:37:39 +08:00
|
|
|
|
2015-12-18 18:03:07 +08:00
|
|
|
class DefaultArgTest(ExperimentCase):
|
|
|
|
def test_default_arg(self):
|
2016-01-08 02:29:35 +08:00
|
|
|
exp = self.create(_DefaultArg)
|
2015-12-19 05:26:18 +08:00
|
|
|
self.assertEqual(exp.run(), 42)
|
2016-01-08 02:29:35 +08:00
|
|
|
|
|
|
|
|
2016-10-06 20:46:05 +08:00
|
|
|
class _RPCTypes(EnvExperiment):
|
|
|
|
def build(self):
|
|
|
|
self.setattr_device("core")
|
|
|
|
self.setattr_device("led")
|
|
|
|
|
|
|
|
def return_bool(self) -> TBool:
|
|
|
|
return True
|
|
|
|
|
|
|
|
def return_int32(self) -> TInt32:
|
|
|
|
return 1
|
|
|
|
|
|
|
|
def return_int64(self) -> TInt64:
|
|
|
|
return 0x100000000
|
|
|
|
|
|
|
|
def return_float(self) -> TFloat:
|
|
|
|
return 1.0
|
|
|
|
|
|
|
|
def return_str(self) -> TStr:
|
|
|
|
return "foo"
|
|
|
|
|
|
|
|
def return_tuple(self) -> TTuple([TInt32, TInt32]):
|
|
|
|
return (1, 2)
|
|
|
|
|
|
|
|
def return_list(self) -> TList(TInt32):
|
|
|
|
return [2, 3]
|
|
|
|
|
|
|
|
def return_range(self) -> TRange32:
|
|
|
|
return range(10)
|
|
|
|
|
|
|
|
@kernel
|
|
|
|
def run_recv(self):
|
|
|
|
core_log(self.return_bool())
|
|
|
|
core_log(self.return_int32())
|
|
|
|
core_log(self.return_int64())
|
|
|
|
core_log(self.return_float())
|
|
|
|
core_log(self.return_str())
|
|
|
|
core_log(self.return_tuple())
|
|
|
|
core_log(self.return_list())
|
|
|
|
core_log(self.return_range())
|
|
|
|
|
|
|
|
def accept(self, value):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@kernel
|
|
|
|
def run_send(self):
|
|
|
|
self.accept(True)
|
|
|
|
self.accept(1)
|
|
|
|
self.accept(0x100000000)
|
|
|
|
self.accept(1.0)
|
|
|
|
self.accept("foo")
|
|
|
|
self.accept((2, 3))
|
|
|
|
self.accept([1, 2])
|
|
|
|
self.accept(range(10))
|
|
|
|
self.accept(self)
|
|
|
|
|
|
|
|
def run(self):
|
|
|
|
self.run_send()
|
|
|
|
self.run_recv()
|
|
|
|
|
|
|
|
|
|
|
|
class RPCTypesTest(ExperimentCase):
|
|
|
|
def test_args(self):
|
|
|
|
exp = self.create(_RPCTypes)
|
|
|
|
exp.run()
|
|
|
|
|
|
|
|
|
|
|
|
class _RPCCalls(EnvExperiment):
|
2016-04-26 06:05:32 +08:00
|
|
|
def build(self):
|
|
|
|
self.setattr_device("core")
|
|
|
|
|
|
|
|
def args(self, *args) -> TInt32:
|
|
|
|
return len(args)
|
|
|
|
|
|
|
|
def kwargs(self, x="", **kwargs) -> TInt32:
|
|
|
|
return len(kwargs)
|
|
|
|
|
|
|
|
@kernel
|
|
|
|
def args0(self):
|
|
|
|
return self.args()
|
|
|
|
|
|
|
|
@kernel
|
|
|
|
def args1(self):
|
|
|
|
return self.args("A")
|
|
|
|
|
|
|
|
@kernel
|
|
|
|
def args2(self):
|
|
|
|
return self.args("A", 1)
|
|
|
|
|
|
|
|
@kernel
|
|
|
|
def kwargs0(self):
|
|
|
|
return self.kwargs()
|
|
|
|
|
|
|
|
@kernel
|
|
|
|
def kwargs1(self):
|
|
|
|
return self.kwargs(a="A")
|
|
|
|
|
|
|
|
@kernel
|
|
|
|
def kwargs2(self):
|
|
|
|
return self.kwargs(a="A", b=1)
|
|
|
|
|
|
|
|
@kernel
|
|
|
|
def args1kwargs2(self):
|
|
|
|
return self.kwargs("X", a="A", b=1)
|
|
|
|
|
2016-07-07 13:00:09 +08:00
|
|
|
@kernel
|
|
|
|
def numpy_things(self):
|
|
|
|
return (numpy.int32(10), numpy.int64(20), numpy.array([42,]))
|
|
|
|
|
2016-07-07 14:33:30 +08:00
|
|
|
@kernel
|
|
|
|
def numpy_full(self):
|
|
|
|
return numpy.full(10, 20)
|
|
|
|
|
2016-04-26 09:31:17 +08:00
|
|
|
@kernel
|
|
|
|
def builtin(self):
|
|
|
|
sleep(1.0)
|
|
|
|
|
2016-06-29 02:37:39 +08:00
|
|
|
|
2016-10-06 20:46:05 +08:00
|
|
|
class RPCCallsTest(ExperimentCase):
|
2016-04-26 06:05:32 +08:00
|
|
|
def test_args(self):
|
2016-10-06 20:46:05 +08:00
|
|
|
exp = self.create(_RPCCalls)
|
2016-04-26 06:05:32 +08:00
|
|
|
self.assertEqual(exp.args0(), 0)
|
|
|
|
self.assertEqual(exp.args1(), 1)
|
|
|
|
self.assertEqual(exp.args2(), 2)
|
|
|
|
self.assertEqual(exp.kwargs0(), 0)
|
|
|
|
self.assertEqual(exp.kwargs1(), 1)
|
|
|
|
self.assertEqual(exp.kwargs2(), 2)
|
|
|
|
self.assertEqual(exp.args1kwargs2(), 2)
|
2016-07-07 13:00:09 +08:00
|
|
|
self.assertEqual(exp.numpy_things(),
|
|
|
|
(numpy.int32(10), numpy.int64(20), numpy.array([42,])))
|
2016-07-07 14:33:30 +08:00
|
|
|
self.assertTrue((exp.numpy_full() == numpy.full(10, 20)).all())
|
2016-04-26 09:31:17 +08:00
|
|
|
exp.builtin()
|
2016-04-26 06:05:32 +08:00
|
|
|
|
|
|
|
|
2016-08-08 11:28:25 +08:00
|
|
|
class _Annotation(EnvExperiment):
|
|
|
|
def build(self):
|
|
|
|
self.setattr_device("core")
|
|
|
|
|
|
|
|
@kernel
|
|
|
|
def overflow(self, x: TInt64) -> TBool:
|
|
|
|
return (x << 32) != 0
|
|
|
|
|
|
|
|
|
|
|
|
class AnnotationTest(ExperimentCase):
|
|
|
|
def test_annotation(self):
|
|
|
|
exp = self.create(_Annotation)
|
|
|
|
self.assertEqual(exp.overflow(1), True)
|
|
|
|
|
|
|
|
|
2016-01-08 02:29:35 +08:00
|
|
|
class _Payload1MB(EnvExperiment):
|
|
|
|
def build(self):
|
|
|
|
self.setattr_device("core")
|
|
|
|
|
|
|
|
def devnull(self, d):
|
|
|
|
pass
|
|
|
|
|
|
|
|
@kernel
|
|
|
|
def run(self):
|
|
|
|
data = [0 for _ in range(1000000//4)]
|
|
|
|
self.devnull(data)
|
|
|
|
|
2016-06-29 02:37:39 +08:00
|
|
|
|
2016-01-08 02:29:35 +08:00
|
|
|
class LargePayloadTest(ExperimentCase):
|
|
|
|
def test_1MB(self):
|
|
|
|
exp = self.create(_Payload1MB)
|
|
|
|
exp.run()
|