Skip to content

Commit

Permalink
coredevice: use device endian for kernel and RPC
Browse files Browse the repository at this point in the history
  • Loading branch information
pca006132 authored and dnadlinger committed Jan 21, 2021
1 parent 3832b26 commit ec72eed
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 21 deletions.
47 changes: 27 additions & 20 deletions artiq/coredevice/comm_kernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,13 @@ def _receive_list(kernel, embedding_map):
return list(buffer)
elif tag == "i":
buffer = kernel._read(4 * length)
return list(struct.unpack(">%sl" % length, buffer))
return list(struct.unpack(kernel.endian + "%sl" % length, buffer))
elif tag == "I":
buffer = kernel._read(8 * length)
return list(struct.unpack(">%sq" % length, buffer))
return list(struct.unpack(kernel.endian + "%sq" % length, buffer))
elif tag == "f":
buffer = kernel._read(8 * length)
return list(struct.unpack(">%sd" % length, buffer))
return list(struct.unpack(kernel.endian + "%sd" % length, buffer))
else:
fn = receivers[tag]
elems = []
Expand All @@ -98,13 +98,13 @@ def _receive_array(kernel, embedding_map):
elems = numpy.ndarray((length, ), 'B', buffer)
elif tag == "i":
buffer = kernel._read(4 * length)
elems = numpy.ndarray((length, ), '>i4', buffer)
elems = numpy.ndarray((length, ), kernel.endian + 'i4', buffer)
elif tag == "I":
buffer = kernel._read(8 * length)
elems = numpy.ndarray((length, ), '>i8', buffer)
elems = numpy.ndarray((length, ), kernel.endian + 'i8', buffer)
elif tag == "f":
buffer = kernel._read(8 * length)
elems = numpy.ndarray((length, ), '>d', buffer)
elems = numpy.ndarray((length, ), kernel.endian + 'd', buffer)
else:
fn = receivers[tag]
elems = []
Expand Down Expand Up @@ -173,21 +173,22 @@ def check_system_info(self):
class CommKernel:
warned_of_mismatch = False

def __init__(self, host, port=1381):
def __init__(self, host, endian='>', port=1381):
self.endian = endian
self._read_type = None
self.host = host
self.port = port
self.read_buffer = bytearray()
self.write_buffer = bytearray()

self.unpack_int32 = struct.Struct(">l").unpack
self.unpack_int64 = struct.Struct(">q").unpack
self.unpack_float64 = struct.Struct(">d").unpack
self.unpack_int32 = struct.Struct(endian + "l").unpack
self.unpack_int64 = struct.Struct(endian + "q").unpack
self.unpack_float64 = struct.Struct(endian + "d").unpack

self.pack_header = struct.Struct(">lB").pack
self.pack_int32 = struct.Struct(">l").pack
self.pack_int64 = struct.Struct(">q").pack
self.pack_float64 = struct.Struct(">d").pack
self.pack_header = struct.Struct(endian + "lB").pack
self.pack_int32 = struct.Struct(endian + "l").pack
self.pack_int64 = struct.Struct(endian + "q").pack
self.pack_float64 = struct.Struct(endian + "d").pack

def open(self):
if hasattr(self, "socket"):
Expand Down Expand Up @@ -466,11 +467,14 @@ def check(cond, expected):
if tag_element == "b":
self._write(bytes(value))
elif tag_element == "i":
self._write(struct.pack(">%sl" % len(value), *value))
self._write(struct.pack(self.endian + "%sl" %
len(value), *value))
elif tag_element == "I":
self._write(struct.pack(">%sq" % len(value), *value))
self._write(struct.pack(self.endian + "%sq" %
len(value), *value))
elif tag_element == "f":
self._write(struct.pack(">%sd" % len(value), *value))
self._write(struct.pack(self.endian + "%sd" %
len(value), *value))
else:
for elt in value:
tags_copy = bytearray(tags)
Expand All @@ -488,13 +492,16 @@ def check(cond, expected):
if tag_element == "b":
self._write(value.reshape((-1,), order="C").tobytes())
elif tag_element == "i":
array = value.reshape((-1,), order="C").astype('>i4')
array = value.reshape(
(-1,), order="C").astype(self.endian + 'i4')
self._write(array.tobytes())
elif tag_element == "I":
array = value.reshape((-1,), order="C").astype('>i8')
array = value.reshape(
(-1,), order="C").astype(self.endian + 'i8')
self._write(array.tobytes())
elif tag_element == "f":
array = value.reshape((-1,), order="C").astype('>d')
array = value.reshape(
(-1,), order="C").astype(self.endian + 'd')
self._write(array.tobytes())
else:
for elt in value.reshape((-1,), order="C"):
Expand Down
4 changes: 3 additions & 1 deletion artiq/coredevice/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -76,15 +76,17 @@ def __init__(self, dmgr, host, ref_period, ref_multiplier=8, target="or1k"):
self.ref_multiplier = ref_multiplier
if target == "or1k":
self.target_cls = OR1KTarget
endian = ">"
elif target == "cortexa9":
self.target_cls = CortexA9Target
endian = "<"
else:
raise ValueError("Unsupported target")
self.coarse_ref_period = ref_period*ref_multiplier
if host is None:
self.comm = CommKernelDummy()
else:
self.comm = CommKernel(host)
self.comm = CommKernel(host, endian)

self.first_run = True
self.dmgr = dmgr
Expand Down

0 comments on commit ec72eed

Please sign in to comment.