@@ -54,14 +54,17 @@ class {{get_fully_qualified_type_name(node)}}_cls(RegWriteOnly):
5454 """
5555 read the register and return a dictionary of the field values
5656 """
57- reg_value = self.read()
58-
59- return_dict = {
60- {% - for child_node in get_reg_readable_fields (node ) %}
61- '{{child_node.inst_name}}' : self.{{safe_node_name(child_node)}}.decode_read_value(reg_value)
62- {% - if not loop .last -%} , {% - endif -%}
63- {% endfor %}
64- }
57+ {% if node .has_sw_writable %}
58+ with self.single_read_modify_write(skip_write=True) as reg:
59+ {% else %}
60+ with self.single_read() as reg:
61+ {% endif %}
62+ return_dict = {
63+ {% - for child_node in get_reg_readable_fields (node ) %}
64+ '{{child_node.inst_name}}' : reg.{{safe_node_name(child_node)}}.read()
65+ {% - if not loop .last -%} , {% - endif -%}
66+ {% endfor %}
67+ }
6568
6669 return return_dict
6770
@@ -74,6 +77,18 @@ class {{get_fully_qualified_type_name(node)}}_cls(RegWriteOnly):
7477 yield self.{{safe_node_name(child_node)}}
7578 {% endfor %}
7679
80+ {# context manager #}
81+ {% if node .has_sw_writable %}
82+ @contextmanager
83+ def single_read_modify_write(self, verify:bool = False, skip_write: bool = False) -> Generator['{{get_fully_qualified_type_name(node)}}_cls', None, None]:
84+ """
85+ Context Manager to do multiple accesses using a single read/modify write operation
86+ """
87+ with super().single_read_modify_write(verify=verify, skip_write=skip_write) as reg:
88+ yield reg
89+ {% endif %}
90+
91+
7792 {% endif %}
7893
7994 {% if node .has_sw_writable %}
@@ -92,25 +107,20 @@ class {{get_fully_qualified_type_name(node)}}_cls(RegWriteOnly):
92107 Do a read-modify-write to the register, updating any field included in
93108 the arguments
94109 """
95-
96110 if len(kwargs) == 0:
97111 raise ValueError('no command args')
98112
99- bit_mask = 0
100- reg_value = 0
113+ with self.single_read_modify_write() as reg:
101114 {% - for child_node in get_reg_writable_fields (node ) %}
102- if '{{safe_node_name(child_node)}}' in kwargs:
103- reg_value |= self.{{safe_node_name(child_node)}}.encode_write_value(kwargs['{{safe_node_name(child_node)}}'])
104- bit_mask |= self.{{safe_node_name(child_node)}}.bitmask
105- kwargs.pop('{{safe_node_name(child_node)}}')
115+ if '{{safe_node_name(child_node)}}' in kwargs:
116+ self.{{safe_node_name(child_node)}}.write(kwargs['{{safe_node_name(child_node)}}'])
117+ kwargs.pop('{{safe_node_name(child_node)}}')
106118 {% - endfor %}
107- if len(kwargs) != 0:
108- # left over unhandled arguments
109- raise ValueError('unrecognised arguments in field')
119+ if len(kwargs) != 0:
120+ # left over unhandled arguments
121+ raise ValueError('unrecognised arguments in field')
110122
111- inverse_bit_mask = self.max_value ^ bit_mask
112123
113- self.write((self.read() & inverse_bit_mask) | reg_value)
114124
115125 {% else %}
116126 def write_fields(self, {% - for child_node in node .fields () -%} {{safe_node_name(child_node)}} : {% - if 'encode' in child_node .list_properties () %} {{get_fully_qualified_enum_type(child_node.get_property('encode'), top_node.parent)}}_enumcls{% else %} int{% endif %}{% - if not loop .last -%} ,{% - endif -%}{% - endfor -%} ) -> None: # type: ignore[override]
0 commit comments