write stencil signiture updated

This commit is contained in:
Nicolas Kruse 2025-09-11 22:46:53 +02:00
parent 7fc222d593
commit 5d24f249bf
4 changed files with 34 additions and 35 deletions

View File

@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
set -e set -e
set -v set -v
python src/copapy/generate_stancils.py python src/copapy/generate_stencils.py
mkdir -p src/copapy/obj mkdir -p src/copapy/obj
gcc -c src/copapy/stancils.c -o src/copapy/obj/stancils_x86_64.o gcc -c src/copapy/stencils.c -o src/copapy/obj/stencils_x86_64.o
ls -l src/copapy/obj/*.o ls -l src/copapy/obj/*.o

View File

@ -14,7 +14,7 @@ def _get_c_function_definitions(code: str) -> dict[str, str]:
return {r[0]: r[1] for r in ret} return {r[0]: r[1] for r in ret}
_ccode = pkgutil.get_data(__name__, 'stancils.c') _ccode = pkgutil.get_data(__name__, 'stencils.c')
assert _ccode is not None assert _ccode is not None
_function_definitions = _get_c_function_definitions(_ccode.decode('utf-8')) _function_definitions = _get_c_function_definitions(_ccode.decode('utf-8'))
@ -238,7 +238,7 @@ def add_read_ops(node_list: list[Node]) -> Generator[tuple[Net | None, Node], No
# print('x swap registers') # print('x swap registers')
type_list = ['int' if r is None else r.dtype for r in registers] type_list = ['int' if r is None else r.dtype for r in registers]
print(type_list) print(type_list)
new_node = Op('read_reg' + str(i) + '_' + '_'.join(type_list), []) new_node = Op(f"read_{net.dtype}_reg{i}_" + '_'.join(type_list), [])
yield net, new_node yield net, new_node
registers[i] = net registers[i] = net
@ -254,11 +254,11 @@ def add_read_ops(node_list: list[Node]) -> Generator[tuple[Net | None, Node], No
def add_write_ops(net_node_list: list[tuple[Net | None, Node]], const_list: list[tuple[str, Net, float | int]]) -> Generator[tuple[Net | None, Node], None, None]: def add_write_ops(net_node_list: list[tuple[Net | None, Node]], const_list: list[tuple[str, Net, float | int]]) -> Generator[tuple[Net | None, Node], None, None]:
"""Add write operation for each new defined net if a read operation is later flowed""" """Add write operation for each new defined net if a read operation is later flowed"""
stored_nets = {c[1] for c in const_list} stored_nets = {c[1] for c in const_list}
read_back_nets = {net for net, node in net_node_list if node.name.startswith('read_reg')} read_back_nets = {net for net, node in net_node_list if node.name.startswith('read_')}
for net, node in net_node_list: for net, node in net_node_list:
yield net, node yield net, node
if net and net in read_back_nets and net not in stored_nets: if net and net in read_back_nets and net not in stored_nets:
yield (net, Op('write_' + net.dtype, [net])) yield (net, Op('write_' + net.dtype, [net]))
stored_nets.add(net) stored_nets.add(net)
@ -277,7 +277,7 @@ def compile_to_instruction_list(end_nodes: Iterable[Node] | Node) -> binw.data_w
extended_output_ops = list(add_write_ops(output_ops, const_list)) extended_output_ops = list(add_write_ops(output_ops, const_list))
obj_file: str = 'src/copapy/obj/stancils_x86_64.o' obj_file: str = 'src/copapy/obj/stencils_x86_64.o'
elf = pelfy.open_elf_file(obj_file) elf = pelfy.open_elf_file(obj_file)
dw = binw.data_writer(elf.byteorder) dw = binw.data_writer(elf.byteorder)

View File

@ -12,7 +12,12 @@ def get_op_code(op: str, type1: str, type2: str, type_out: str):
}} }}
""" """
def get_result_stubs(type1: str, type2: str): def get_result_stubs1(type1: str):
return f"""
void result_{type1}({type1} arg1);
"""
def get_result_stubs2(type1: str, type2: str):
return f""" return f"""
void result_{type1}_{type2}({type1} arg1, {type2} arg2); void result_{type1}_{type2}({type1} arg1, {type2} arg2);
""" """
@ -35,12 +40,12 @@ def get_read_reg1_code(type1: str, type2: str, type_out: str):
}} }}
""" """
def get_write_code(type1: str, type2: str): def get_write_code(type1: str):
return f""" return f"""
void write_{type1}_{type2}({type1} arg1, {type2} arg2) {{ void write_{type1}({type1} arg1) {{
asm volatile (".long 0xF17ECAFE"); asm volatile (".long 0xF17ECAFE");
dummy_{type1} = arg1; dummy_{type1} = arg1;
result_{type1}_{type2}(arg1, arg2); result_{type1}(arg1);
asm volatile (".long 0xF27ECAFE"); asm volatile (".long 0xF27ECAFE");
}} }}
""" """
@ -59,14 +64,18 @@ if __name__ == "__main__":
ops = ['add', 'sub', 'mul', 'div'] ops = ['add', 'sub', 'mul', 'div']
code = """ code = """
// Auto-generated stancils for copapy // Auto-generated stencils for copapy
// Do not edit manually // Do not edit manually
volatile int dummy_int = 1337; volatile int dummy_int = 1337;
volatile float dummy_float = 1337; volatile float dummy_float = 1337;
""" """
for t1 in types:
code += get_result_stubs1(t1)
for t1, t2 in permutate(types, types): for t1, t2 in permutate(types, types):
code += get_result_stubs(t1, t2) code += get_result_stubs2(t1, t2)
for op, t1, t2 in permutate(ops, types, types): for op, t1, t2 in permutate(ops, types, types):
t_out = t1 if t1 == t2 else 'float' t_out = t1 if t1 == t2 else 'float'
@ -76,8 +85,8 @@ if __name__ == "__main__":
code += get_read_reg0_code(t1, t2, t_out) code += get_read_reg0_code(t1, t2, t_out)
code += get_read_reg1_code(t1, t2, t_out) code += get_read_reg1_code(t1, t2, t_out)
for t1, t2 in permutate(types, types): for t1 in types:
code += get_write_code(t1, t2) code += get_write_code(t1)
with open('src/copapy/stancils.c', 'w') as f: with open('src/copapy/stencils.c', 'w') as f:
f.write(code) f.write(code)

View File

@ -1,10 +1,14 @@
// Auto-generated stancils for copapy // Auto-generated stencils for copapy
// Do not edit manually // Do not edit manually
volatile int dummy_int = 1337; volatile int dummy_int = 1337;
volatile float dummy_float = 1337; volatile float dummy_float = 1337;
void result_int(int arg1);
void result_float(float arg1);
void result_int_int(int arg1, int arg2); void result_int_int(int arg1, int arg2);
void result_int_float(int arg1, float arg2); void result_int_float(int arg1, float arg2);
@ -205,31 +209,17 @@
asm volatile (".long 0xF27ECAFE"); asm volatile (".long 0xF27ECAFE");
} }
void write_int_int(int arg1, int arg2) { void write_int(int arg1) {
asm volatile (".long 0xF17ECAFE"); asm volatile (".long 0xF17ECAFE");
dummy_int = arg1; dummy_int = arg1;
result_int_int(arg1, arg2); result_int(arg1);
asm volatile (".long 0xF27ECAFE"); asm volatile (".long 0xF27ECAFE");
} }
void write_int_float(int arg1, float arg2) { void write_float(float arg1) {
asm volatile (".long 0xF17ECAFE");
dummy_int = arg1;
result_int_float(arg1, arg2);
asm volatile (".long 0xF27ECAFE");
}
void write_float_int(float arg1, int arg2) {
asm volatile (".long 0xF17ECAFE"); asm volatile (".long 0xF17ECAFE");
dummy_float = arg1; dummy_float = arg1;
result_float_int(arg1, arg2); result_float(arg1);
asm volatile (".long 0xF27ECAFE");
}
void write_float_float(float arg1, float arg2) {
asm volatile (".long 0xF17ECAFE");
dummy_float = arg1;
result_float_float(arg1, arg2);
asm volatile (".long 0xF27ECAFE"); asm volatile (".long 0xF27ECAFE");
} }