From d912a4d79ed9e51e5dfcc24e6445c1de7dbb1a30 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Sat, 15 Mar 2025 14:04:10 -0600 Subject: lib9p: idl.gen: Have a separate type that excludes idl.Primitive --- lib9p/idl.gen | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'lib9p/idl.gen') diff --git a/lib9p/idl.gen b/lib9p/idl.gen index 779b6d5..b75ffd6 100755 --- a/lib9p/idl.gen +++ b/lib9p/idl.gen @@ -147,8 +147,8 @@ def ifdef_pop(n: int) -> str: # topo_sorted() ################################################################ -def topo_sorted(typs: list[idl.Type]) -> typing.Iterable[idl.Type]: - ts: graphlib.TopologicalSorter[idl.Type] = graphlib.TopologicalSorter() +def topo_sorted(typs: list[idl.UserType]) -> typing.Iterable[idl.UserType]: + ts: graphlib.TopologicalSorter[idl.UserType] = graphlib.TopologicalSorter() for typ in typs: match typ: case idl.Number(): @@ -375,7 +375,7 @@ def get_buffer_size(typ: idl.Type, version: str) -> BufferSize: # Generate .h ################################################################## -def gen_h(versions: set[str], typs: list[idl.Type]) -> str: +def gen_h(versions: set[str], typs: list[idl.UserType]) -> str: global _ifdef_stack _ifdef_stack = [] @@ -451,7 +451,7 @@ enum {idprefix}version {{ """ def per_version_comment( - typ: idl.Type, fn: typing.Callable[[idl.Type, str], str] + typ: idl.UserType, fn: typing.Callable[[idl.UserType, str], str] ) -> str: lines: dict[str, str] = {} for version in sorted(typ.in_versions): @@ -471,7 +471,7 @@ enum {idprefix}version {{ ret += "\n" ret += ifdef_push(1, c_ver_ifdef(typ.in_versions)) - def sum_size(typ: idl.Type, version: str) -> str: + def sum_size(typ: idl.UserType, version: str) -> str: sz = get_buffer_size(typ, version) assert ( sz.min_size <= sz.exp_size @@ -643,7 +643,7 @@ enum {idprefix}version {{ # Generate .c ################################################################## -def gen_c(versions: set[str], typs: list[idl.Type]) -> str: +def gen_c(versions: set[str], typs: list[idl.UserType]) -> str: global _ifdef_stack _ifdef_stack = [] @@ -1088,7 +1088,7 @@ LM_ALWAYS_INLINE static void unmarshal_8(struct _unmarshal_ctx *ctx, uint64_t *o type OffsetExprRecursion = typing.Callable[[Path], WalkCmd] - def get_offset_expr(typ: idl.Type, recurse: OffsetExprRecursion) -> OffsetExpr: + def get_offset_expr(typ: idl.UserType, recurse: OffsetExprRecursion) -> OffsetExpr: if not isinstance(typ, idl.Struct): assert typ.static_size ret = OffsetExpr() -- cgit v1.2.3-2-g168b From 83c207920d2073c45ff15d1da92a126d8d892eec Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Sat, 22 Mar 2025 12:13:08 -0600 Subject: lib9p: idl: Have bitfield bit names be less heuristic --- lib9p/idl.gen | 98 ++++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 67 insertions(+), 31 deletions(-) (limited to 'lib9p/idl.gen') diff --git a/lib9p/idl.gen b/lib9p/idl.gen index b75ffd6..af70097 100755 --- a/lib9p/idl.gen +++ b/lib9p/idl.gen @@ -499,45 +499,75 @@ enum {idprefix}version {{ ret += f"#define {prefix}{name.ljust(namewidth)} (({c_typename(typ)})UINT{typ.static_size*8}_C({val}))\n" case idl.Bitfield(): ret += f"typedef {c_typename(typ.prim)} {c_typename(typ)};\n" - names = [ - typ.bits[n] or f" {n}" for n in reversed(range(0, len(typ.bits))) - ] - if aliases := [k for k in typ.names if k not in typ.bits]: - names.append("") - names.extend(aliases) - prefix = f"{idprefix.upper()}{typ.typname.upper()}_" - namewidth = max(len(add_prefix(prefix, name)) for name in names) - ret += "\n" - for name in names: - if name == "": - ret += "\n" - continue + def bitname(val: idl.Bit | idl.BitAlias) -> str: + s = val.bitname + match val: + case idl.Bit(cat=idl.BitCat.RESERVED): + s = "_RESERVED_" + s + case idl.Bit(cat=idl.BitCat.SUBFIELD): + assert isinstance(typ, idl.Bitfield) + n = sum( + 1 + for b in typ.bits[: val.num] + if b.cat == idl.BitCat.SUBFIELD + and b.bitname == val.bitname + ) + s = f"_{s}_{n}" + case idl.Bit(cat=idl.BitCat.UNUSED): + return "" + return add_prefix(f"{idprefix.upper()}{typ.typname.upper()}_", s) - if name.startswith(" "): - vers = typ.in_versions - c_name = "" - c_val = f"1<<{name[1:]}" - else: - vers = typ.names[name].in_versions - c_name = add_prefix(prefix, name) - c_val = f"{typ.names[name].val}" + namewidth = max( + len(bitname(val)) for val in [*typ.bits, *typ.names.values()] + ) + ret += "\n" + for bit in reversed(typ.bits): + vers = bit.in_versions + if bit.cat == idl.BitCat.UNUSED: + vers = typ.in_versions ret += ifdef_push(2, c_ver_ifdef(vers)) # It is important all of the `beg` strings have # the same length. end = "" - if name.startswith(" "): - beg = "/* unused" - end = " */" - elif _ifdef_stack[-1]: - beg = "# define" - else: - beg = "#define " + match bit.cat: + case ( + idl.BitCat.USED | idl.BitCat.RESERVED | idl.BitCat.SUBFIELD + ): + if _ifdef_stack[-1]: + beg = "# define" + else: + beg = "#define " + case idl.BitCat.UNUSED: + beg = "/* unused" + end = " */" + + c_name = bitname(bit) + c_val = f"1<<{bit.num}" + ret += f"{beg} {c_name:<{namewidth}} (({c_typename(typ)})({c_val})){end}\n" + if aliases := [ + alias + for alias in typ.names.values() + if isinstance(alias, idl.BitAlias) + ]: + ret += "\n" - ret += f"{beg} {c_name.ljust(namewidth)} (({c_typename(typ)})({c_val})){end}\n" + for alias in aliases: + ret += ifdef_push(2, c_ver_ifdef(alias.in_versions)) + + end = "" + if _ifdef_stack[-1]: + beg = "# define" + else: + beg = "#define " + + c_name = bitname(alias) + c_val = alias.val + ret += f"{beg} {c_name:<{namewidth}} (({c_typename(typ)})({c_val})){end}\n" ret += ifdef_pop(1) + del bitname case idl.Struct(): # and idl.Message(): ret += c_typename(typ) + " {" if not typ.members: @@ -554,6 +584,7 @@ enum {idprefix}version {{ ret += f"\t{c_typename(member.typ, member).ljust(typewidth)} {'*' if member.cnt else ' '}{member.membname};\n" ret += ifdef_pop(1) ret += "};\n" + del typ ret += ifdef_pop(0) ret += """ @@ -746,8 +777,13 @@ const char *const _{idprefix}table_ver_name[{c_ver_enum('NUM')}] = {{ ret += ( f"\t[{c_ver_enum(ver)}]{' '*(verwidth-len(ver))} = 0b" + "".join( - "1" if typ.bit_is_valid(bitname, ver) else "0" - for bitname in reversed(typ.bits) + ( + "1" + if bit.cat in (idl.BitCat.USED, idl.BitCat.SUBFIELD) + and ver in bit.in_versions + else "0" + ) + for bit in reversed(typ.bits) ) + ",\n" ) -- cgit v1.2.3-2-g168b From a3e4bb076965497736b07ed38b92646fb5c7c219 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Sat, 22 Mar 2025 12:20:29 -0600 Subject: lib9p: idl.gen: Fix syntax error messages when the line has a tab --- lib9p/idl.gen | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'lib9p/idl.gen') diff --git a/lib9p/idl.gen b/lib9p/idl.gen index af70097..65ff734 100755 --- a/lib9p/idl.gen +++ b/lib9p/idl.gen @@ -1420,8 +1420,10 @@ def main() -> None: ) assert e.text print(f"\t{e.text}", file=sys.stderr) + text_suffix = e.text.lstrip() + text_prefix = e.text[: -len(text_suffix)] print( - f"\t{ANSIColors.RED}{'~'*len(e.text)}{ANSIColors.RESET}", + f"\t{text_prefix}{ANSIColors.RED}{'~'*len(text_suffix)}{ANSIColors.RESET}", file=sys.stderr, ) sys.exit(2) -- cgit v1.2.3-2-g168b From 8f98e46ecb901df499010e77e17d044ce2f3f3a4 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Sat, 22 Mar 2025 03:26:04 -0600 Subject: Python: Clean up f-strings --- lib9p/idl.gen | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'lib9p/idl.gen') diff --git a/lib9p/idl.gen b/lib9p/idl.gen index 65ff734..eaeca49 100755 --- a/lib9p/idl.gen +++ b/lib9p/idl.gen @@ -440,9 +440,7 @@ enum {idprefix}version {{ continue msg = id2typ[n] ret += ifdef_push(1, c_ver_ifdef(msg.in_versions)) - ret += ( - f"\t{idprefix.upper()}TYP_{msg.typname.ljust(namewidth)} = {msg.msgid},\n" - ) + ret += f"\t{idprefix.upper()}TYP_{msg.typname:<{namewidth}} = {msg.msgid},\n" ret += ifdef_pop(0) ret += "};\n" @@ -464,7 +462,7 @@ enum {idprefix}version {{ ret = "" v_width = max(len(c_ver_enum(v)) for v in typ.in_versions) for version, line in lines.items(): - ret += f"/* {c_ver_enum(version).ljust(v_width)}: {line} */\n" + ret += f"/* {c_ver_enum(version):<{v_width}}: {line} */\n" return ret for typ in topo_sorted(typs): @@ -496,7 +494,7 @@ enum {idprefix}version {{ prefix = f"{idprefix.upper()}{typ.typname.upper()}_" namewidth = max(len(name) for name in typ.vals) for name, val in typ.vals.items(): - ret += f"#define {prefix}{name.ljust(namewidth)} (({c_typename(typ)})UINT{typ.static_size*8}_C({val}))\n" + ret += f"#define {prefix}{name:<{namewidth}} (({c_typename(typ)})UINT{typ.static_size*8}_C({val}))\n" case idl.Bitfield(): ret += f"typedef {c_typename(typ.prim)} {c_typename(typ)};\n" @@ -581,7 +579,7 @@ enum {idprefix}version {{ if member.val: continue ret += ifdef_push(2, c_ver_ifdef(member.in_versions)) - ret += f"\t{c_typename(member.typ, member).ljust(typewidth)} {'*' if member.cnt else ' '}{member.membname};\n" + ret += f"\t{c_typename(member.typ, member):<{typewidth}} {'*' if member.cnt else ' '}{member.membname};\n" ret += ifdef_pop(1) ret += "};\n" del typ -- cgit v1.2.3-2-g168b