Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

AssertionError when declaring bytearray inside of kernel #2684

Open
MorganTL opened this issue Feb 14, 2025 · 3 comments
Open

AssertionError when declaring bytearray inside of kernel #2684

MorganTL opened this issue Feb 14, 2025 · 3 comments

Comments

@MorganTL
Copy link
Contributor

Bug Report

One-Line Summary

AssertionError when declaring bytearray(len) inside of kernel, see example below

Issue Details

Steps to Reproduce

example with error

from artiq.language.core import kernel
from artiq.experiment import *

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

    @kernel
    def run(self):
        buf = bytearray(1)

example that runs fine

from artiq.language.core import kernel
from artiq.experiment import *

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

    @kernel
    def run(self):
        buf = bytearray([0x00])

Expected Behavior

No AssertionError when using bytearray(len)

Actual (undesired) Behavior

❯ artiq_run error_kernel.py
Traceback (most recent call last):
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/bin/.artiq_run-wrapped", line 9, in <module>
    sys.exit(main())
             ^^^^^^
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/frontend/artiq_run.py", line 269, in main
    return run(with_file=True)
           ^^^^^^^^^^^^^^^^^^^
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/frontend/artiq_run.py", line 253, in run
    raise exn
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/frontend/artiq_run.py", line 245, in run
    exp_inst.run()
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/language/core.py", line 54, in run_on_core
    return getattr(self, arg).run(run_on_core, ((self,) + k_args), k_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/coredevice/core.py", line 175, in run
    self.compile(function, args, kwargs, set_result)
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/coredevice/core.py", line 144, in compile
    module = Module(stitcher,
             ^^^^^^^^^^^^^^^^
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/compiler/module.py", line 78, in __init__
    self.artiq_ir = artiq_ir_generator.visit(src.typedtree)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/compiler/transforms/artiq_ir_generator.py", line 181, in visit
    return self._visit_one(obj)
           ^^^^^^^^^^^^^^^^^^^^
  File "/nix/store/lfsad748z7m0xxmwxagx3drv2qjl9d6c-python3.12-pythonparser-1.4/lib/python3.12/site-packages/pythonparser/algorithm.py", line 32, in _visit_one
    return getattr(self, visit_attr)(node)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/compiler/transforms/artiq_ir_generator.py", line 209, in visit_ModuleT
    self.generic_visit(node)
  File "/nix/store/lfsad748z7m0xxmwxagx3drv2qjl9d6c-python3.12-pythonparser-1.4/lib/python3.12/site-packages/pythonparser/algorithm.py", line 27, in generic_visit
    self.visit(getattr(node, field_name))
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/compiler/transforms/artiq_ir_generator.py", line 177, in visit
    self.visit(elt)
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/compiler/transforms/artiq_ir_generator.py", line 181, in visit
    return self._visit_one(obj)
           ^^^^^^^^^^^^^^^^^^^^
  File "/nix/store/lfsad748z7m0xxmwxagx3drv2qjl9d6c-python3.12-pythonparser-1.4/lib/python3.12/site-packages/pythonparser/algorithm.py", line 32, in _visit_one
    return getattr(self, visit_attr)(node)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/compiler/transforms/artiq_ir_generator.py", line 362, in visit_QuotedFunctionDefT
    self.visit_function(node, is_internal=True, is_quoted=True, flags=node.flags)
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/compiler/transforms/artiq_ir_generator.py", line 322, in visit_function
    result = self.visit(node.body)
             ^^^^^^^^^^^^^^^^^^^^^
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/compiler/transforms/artiq_ir_generator.py", line 177, in visit
    self.visit(elt)
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/compiler/transforms/artiq_ir_generator.py", line 181, in visit
    return self._visit_one(obj)
           ^^^^^^^^^^^^^^^^^^^^
  File "/nix/store/lfsad748z7m0xxmwxagx3drv2qjl9d6c-python3.12-pythonparser-1.4/lib/python3.12/site-packages/pythonparser/algorithm.py", line 32, in _visit_one
    return getattr(self, visit_attr)(node)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/compiler/transforms/artiq_ir_generator.py", line 392, in visit_Assign
    self.current_assign = self.visit(node.value)
                          ^^^^^^^^^^^^^^^^^^^^^^
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/compiler/transforms/artiq_ir_generator.py", line 181, in visit
    return self._visit_one(obj)
           ^^^^^^^^^^^^^^^^^^^^
  File "/nix/store/lfsad748z7m0xxmwxagx3drv2qjl9d6c-python3.12-pythonparser-1.4/lib/python3.12/site-packages/pythonparser/algorithm.py", line 32, in _visit_one
    return getattr(self, visit_attr)(node)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/compiler/transforms/artiq_ir_generator.py", line 2731, in visit_CallT
    insn = self.visit_builtin_call(node)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/compiler/transforms/artiq_ir_generator.py", line 2279, in visit_builtin_call
    length = self.iterable_len(arg)
             ^^^^^^^^^^^^^^^^^^^^^^
  File "/nix/store/jcxld3n9l2xhccck94sy8qk961ly509h-python3.12-artiq-9.0+unknown.beta/lib/python3.12/site-packages/artiq/compiler/transforms/artiq_ir_generator.py", line 529, in iterable_len
    assert False
           ^^^^^
AssertionError
                                                                                                                                                                                                                  

Your System (omit irrelevant parts)

  • Operating System: Nixos
  • ARTIQ version: artiq master (994f60e)
@SimonRenblad
Copy link
Contributor

elif len(node.args) == 1 and len(node.keywords) == 0:
arg = self.visit(node.args[0])
length = self.iterable_len(arg)
result = self.append(ir.Alloc([length], node.type))
def body_gen(index):
elt = self.iterable_get(arg, index)
elt = self.append(ir.Coerce(elt, builtins.get_iterable_elt(node.type)))
self.append(ir.SetElem(result, index, elt))
return self.append(ir.Arith(ast.Add(loc=None), index,
ir.Constant(1, length.type)))
self._make_loop(ir.Constant(0, length.type),
lambda index: self.append(ir.Compare(ast.Lt(loc=None), index, length)),
body_gen)

The compiler reuses the same logic as for lists here and assumes the argument is an iterable. The same issue should exist for bytes(len) I would imagine.

@sbourdeauducq
Copy link
Member

sbourdeauducq commented Feb 14, 2025

What's the use case for bytes in kernels?
In nac3 we just don't support them entirely, seems everything is covered with integer lists and numpy arrays.

@MorganTL
Copy link
Contributor Author

I was implementing downloading the camera xml files via cxp syscall. And bytearray was used to store the result before outputting to the PC.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants