From 7e2a73fffe30fba721cde959c880851cd6dfc66d Mon Sep 17 00:00:00 2001 From: Yi Zhang Date: Tue, 2 Aug 2022 20:18:03 +0800 Subject: [PATCH 1/6] Update sample block.xlsx. --- excels/block1.xlsx | Bin 14329 -> 14363 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/excels/block1.xlsx b/excels/block1.xlsx index 72e800c05b50cd961bab677e3f5ae716466b6e40..75e42613790ccc65218c309989c1bbe4fdae94fe 100644 GIT binary patch delta 7751 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 delta 7683 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%0AjmhO1P(*h5z#%^Ist*^mxBVd5cannwG zlau(gdS^!nElCB4roYkqxS}i-RaZC57%-yi^Z%5a6 zt~-i5@=RM8ahnEj)%Wja&gxrqyS9h`;Zrw1pv+o^UMk$J?(M-GYFkAuYlD=fBwWdU z-At~3Obt^0TsJw|7ZqbxWDDO*g|-P)rCij`NH5-VTnLn=iZ&IUnkTHhEyFdazEn-kcP2%52L??I*>X50ILf#3Skm}e z&N6R){wC5NAhf;>9slA9wp0hEGkJ=kLT+~_QyhYwWpIb~a-8yh+s)szg#P9DGgUZ$ zq!yCN`>xvPZ3LOO*rILyB1=o~eF5<#qrMBpOfXM!s1Oa{q0ulSPuYJ@h*Y< zpVlJ^0D$#+t^aqd0%3XFG%z7!*00++szy|;UuW$ej;Ggyh*=zIi z-=(isBRWi&mzn%uA@BbJ=I~&vU{Y8%FE;uAl@|Ve5E(J7oQID5pOWtNJ23u@zFOr} zuw`y4@_){tS7ieKe*t*FFd`m$*iRl(_#-;lArB8sm7V-Fd!e8`JdnZwfMyT gUw|%-SE6w+QE_%~bYVAgbcDh2;{)U0{Ri{^0FD|>;s5{u From 33760805ff4d17d861b01a4e9faaf0b6f415a36b Mon Sep 17 00:00:00 2001 From: Yi Zhang Date: Tue, 2 Aug 2022 20:39:32 +0800 Subject: [PATCH 2/6] Skip reserved field in doc. --- register_printer/generators/doc_generator/print_doc.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/register_printer/generators/doc_generator/print_doc.py b/register_printer/generators/doc_generator/print_doc.py index b3d324d..d42fd9d 100644 --- a/register_printer/generators/doc_generator/print_doc.py +++ b/register_printer/generators/doc_generator/print_doc.py @@ -33,8 +33,12 @@ def print_doc_reg(reg, dh, reg_idx, blk_idx, blk_insts): "Access", "Default", "Description"] + row_count = 1 + for field in reg.fields: + if field.name != "-": + row_count += 1 tb = dh.add_table( - len(reg.fields) + 1, + row_count, len(headers), style="Light Grid") tb.autofit = 1 @@ -48,6 +52,8 @@ def print_doc_reg(reg, dh, reg_idx, blk_idx, blk_insts): i = 1 for field in reg.fields: + if field.name == "-": + continue tb.cell(i, 0).text = str(field.lsb) tb.cell(i, 1).text = str(field.msb) tb.cell(i, 2).text = str(field.name) From 03a248ecb1872245e3d6f7662b1d39a2009ff83a Mon Sep 17 00:00:00 2001 From: Yi Zhang Date: Tue, 2 Aug 2022 21:15:49 +0800 Subject: [PATCH 3/6] Print Array registers. --- .../generators/doc_generator/print_doc.py | 51 ++++++++++++++----- 1 file changed, 37 insertions(+), 14 deletions(-) diff --git a/register_printer/generators/doc_generator/print_doc.py b/register_printer/generators/doc_generator/print_doc.py index d42fd9d..701c96a 100644 --- a/register_printer/generators/doc_generator/print_doc.py +++ b/register_printer/generators/doc_generator/print_doc.py @@ -3,7 +3,7 @@ import logging from docx import Document from docx.enum.text import WD_PARAGRAPH_ALIGNMENT -from register_printer.data_model import Register +from register_printer.data_model import Register, Array LOGGER = logging.getLogger(__name__) @@ -67,19 +67,32 @@ def print_doc_reg(reg, dh, reg_idx, blk_idx, blk_insts): def get_unreserved_non_array_register(block): result = [] for register in block.registers: - if not isinstance(register, Register): - continue - if register.is_reserved: - continue - result.append(register) + if isinstance(register, Array): + result.append(register) + elif isinstance(register, Register): + if register.is_reserved: + continue + else: + result.append(register) return result +def calc_row_num(registers): + num = 0 + for register in registers: + if isinstance(register, Array): + struct = register.content_type + num += len(struct.registers) + else: + num += 1 + return num + + def print_doc_block(doc, idx, block, instances): block_type = block.block_type registers = get_unreserved_non_array_register(block) - num_register = len(registers) + num_register = calc_row_num(registers) doc.add_heading("%d %s Registers" % (idx, block_type), level=1) tb = doc.add_table( @@ -98,16 +111,26 @@ def print_doc_block(doc, idx, block, instances): i = 1 for register in registers: - tb.cell(i, 0).text = hex(register.offset) - for k in range(len(instances)): - tb.cell(i, k+1).text = hex( - instances[k].base_address + register.offset) - tb.cell(i, len(hdr) - 1).text = str(register.name) - i += 1 + if isinstance(register, Register): + tb.cell(i, 0).text = hex(register.offset) + for k in range(len(instances)): + tb.cell(i, k+1).text = hex( + instances[k].base_address + register.offset) + tb.cell(i, len(hdr) - 1).text = str(register.name) + i += 1 + elif isinstance(register, Array): + struct = register.content_type + for struct_registers in struct.registers: + if struct_registers.is_reserved: + continue + tb.cell(i, 0).text = hex(struct_registers.offset) + tb.cell(i, len(hdr) - 1).text = str(struct_registers.name) + i += 1 reg_idx = 0 for register in registers: - print_doc_reg(register, doc, reg_idx, idx, instances) + if isinstance(register, Register): + print_doc_reg(register, doc, reg_idx, idx, instances) reg_idx = reg_idx + 1 doc.add_page_break() return From ce2cb2789b42accdcbc2bf8a06719ff6ef61a1e5 Mon Sep 17 00:00:00 2001 From: Yi Zhang Date: Tue, 2 Aug 2022 21:24:17 +0800 Subject: [PATCH 4/6] Fixed array reg information in doc. --- .../generators/doc_generator/print_doc.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/register_printer/generators/doc_generator/print_doc.py b/register_printer/generators/doc_generator/print_doc.py index 701c96a..92be4ed 100644 --- a/register_printer/generators/doc_generator/print_doc.py +++ b/register_printer/generators/doc_generator/print_doc.py @@ -82,7 +82,11 @@ def calc_row_num(registers): for register in registers: if isinstance(register, Array): struct = register.content_type - num += len(struct.registers) + for struct_register in struct.registers: + if struct_register.is_reserved: + continue + else: + num += 1 else: num += 1 return num @@ -123,7 +127,16 @@ def print_doc_block(doc, idx, block, instances): for struct_registers in struct.registers: if struct_registers.is_reserved: continue - tb.cell(i, 0).text = hex(struct_registers.offset) + offset_str = hex( + struct_registers.offset + register.start_address) + offset_str += " + " + hex(register.offset) + " * n" + offset_str += " (n >= 0, n < " + str(register.length) + ")" + tb.cell(i, 0).text = offset_str + for k in range(len(instances)): + tb.cell(i, k + 1).text = hex( + instances[k].base_address + register.start_address + + struct_registers.offset + ) tb.cell(i, len(hdr) - 1).text = str(struct_registers.name) i += 1 From f704af04ddbe2227b715c01069b6d7df06d9e12a Mon Sep 17 00:00:00 2001 From: Yi Zhang Date: Tue, 2 Aug 2022 21:43:33 +0800 Subject: [PATCH 5/6] Add Array register in doc. --- .../generators/doc_generator/print_doc.py | 33 ++++++++++++++++--- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/register_printer/generators/doc_generator/print_doc.py b/register_printer/generators/doc_generator/print_doc.py index 92be4ed..55841dc 100644 --- a/register_printer/generators/doc_generator/print_doc.py +++ b/register_printer/generators/doc_generator/print_doc.py @@ -9,16 +9,27 @@ LOGGER = logging.getLogger(__name__) -def print_doc_reg(reg, dh, reg_idx, blk_idx, blk_insts): +def print_doc_reg(reg, dh, reg_idx, blk_idx, blk_insts, array=None): dh.add_page_break() dh.add_heading(" %d.%d %s" % (blk_idx, reg_idx + 1, reg.name), level=2) p = dh.add_paragraph() p.add_run(' Offset : ').bold = True - p.add_run('%s\n' % (hex(reg.offset))) + if array is None: + p.add_run('%s\n' % (hex(reg.offset))) + else: + offset_str = hex( + reg.offset + array.start_address) + offset_str += " + " + hex(array.offset) + " * n" + offset_str += " (n >= 0, n < " + str(array.length) + ")" + p.add_run('%s\n' % offset_str) for blk_inst in blk_insts: p.add_run(' %s Address : ' % (blk_inst.name)).bold = True - p.add_run('%s\n' % (hex(blk_inst.base_address + reg.offset))) + if array is None: + p.add_run('%s\n' % (hex(blk_inst.base_address + reg.offset))) + else: + addr = blk_inst.base_address + array.start_address + reg.offset + p.add_run('%s\n' % hex(addr)) p.add_run(" Reset Value : ").bold = True p.add_run("0x%x\n" % (reg.calculate_register_default())) @@ -144,7 +155,21 @@ def print_doc_block(doc, idx, block, instances): for register in registers: if isinstance(register, Register): print_doc_reg(register, doc, reg_idx, idx, instances) - reg_idx = reg_idx + 1 + reg_idx += 1 + if isinstance(register, Array): + struct = register.content_type + for struct_reg in struct.registers: + if struct_reg.is_reserved: + continue + print_doc_reg( + struct_reg, + doc, + reg_idx, + idx, + instances, + register + ) + reg_idx += 1 doc.add_page_break() return From 0554d1cc29c6ae7d97247c99ecb0d03aaaa4b01c Mon Sep 17 00:00:00 2001 From: Yi Zhang Date: Tue, 2 Aug 2022 22:09:43 +0800 Subject: [PATCH 6/6] Fixed offset overwrite. --- .../generators/doc_generator/print_doc.py | 35 +++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/register_printer/generators/doc_generator/print_doc.py b/register_printer/generators/doc_generator/print_doc.py index 55841dc..577a9ae 100644 --- a/register_printer/generators/doc_generator/print_doc.py +++ b/register_printer/generators/doc_generator/print_doc.py @@ -3,8 +3,7 @@ import logging from docx import Document from docx.enum.text import WD_PARAGRAPH_ALIGNMENT -from register_printer.data_model import Register, Array - +from register_printer.data_model import Register, Array, Field LOGGER = logging.getLogger(__name__) @@ -33,6 +32,36 @@ def print_doc_reg(reg, dh, reg_idx, blk_idx, blk_insts, array=None): p.add_run(" Reset Value : ").bold = True p.add_run("0x%x\n" % (reg.calculate_register_default())) + if array is not None: + for index in range(array.length): + offset = array.start_address + array.offset * index + reg.offset + temp_reg = Register(offset) + temp_reg.name = reg.name + for field in reg.fields: + temp_reg.fields.append(field) + found = False + for overwrite_entry in array.default_overwrite_entries: + if overwrite_entry.index == index and \ + overwrite_entry.register_name == temp_reg.name: + found = True + field_name = overwrite_entry.field_name + for field in temp_reg.fields: + if field.name == field_name: + temp_reg.fields.remove(field) + new_field = Field() + new_field.name = field.name + new_field.msb = field.msb + new_field.lsb = field.lsb + new_field.default = overwrite_entry.default + new_field.access = field.access + new_field.description = field.description + temp_reg.fields.append(new_field) + if found: + p.add_run( + " " + + hex(temp_reg.offset) + ":0x%x\n" % + temp_reg.calculate_register_default() + ) p.add_run(" Description : ").bold = True p.add_run("%s\n" % (reg.description)) @@ -129,7 +158,7 @@ def print_doc_block(doc, idx, block, instances): if isinstance(register, Register): tb.cell(i, 0).text = hex(register.offset) for k in range(len(instances)): - tb.cell(i, k+1).text = hex( + tb.cell(i, k + 1).text = hex( instances[k].base_address + register.offset) tb.cell(i, len(hdr) - 1).text = str(register.name) i += 1