summaryrefslogtreecommitdiffstats
path: root/Tools
diff options
context:
space:
mode:
authorKevin Diem <kg.diem@gmail.com>2023-07-16 15:16:34 (GMT)
committerGitHub <noreply@github.com>2023-07-16 15:16:34 (GMT)
commitcc25ca16ee406db936dfbd2337cbd14b12ccc4b7 (patch)
treeca9f68c9b35b7a5aab149da2ad93c21bf0ecc428 /Tools
parente58960160fcb4fce63177fcd9ef605f887377767 (diff)
downloadcpython-cc25ca16ee406db936dfbd2337cbd14b12ccc4b7.zip
cpython-cc25ca16ee406db936dfbd2337cbd14b12ccc4b7.tar.gz
cpython-cc25ca16ee406db936dfbd2337cbd14b12ccc4b7.tar.bz2
gh-106706: Streamline family syntax in cases generator DSL (#106716)
From `family(opname, STRUCTSIZE) = OPNAME + SPEC1 + ... + SPECn;` to `family(OPNAME, STRUCTSIZE) = SPEC1 + ... + SPECn;`
Diffstat (limited to 'Tools')
-rw-r--r--Tools/cases_generator/generate_cases.py27
-rw-r--r--Tools/cases_generator/interpreter_definition.md2
-rw-r--r--Tools/cases_generator/test_generator.py2
3 files changed, 15 insertions, 16 deletions
diff --git a/Tools/cases_generator/generate_cases.py b/Tools/cases_generator/generate_cases.py
index 6589289..3edd8ee 100644
--- a/Tools/cases_generator/generate_cases.py
+++ b/Tools/cases_generator/generate_cases.py
@@ -438,7 +438,7 @@ class Instruction:
"""Write one instruction, sans prologue and epilogue."""
# Write a static assertion that a family's cache size is correct
if family := self.family:
- if self.name == family.members[0]:
+ if self.name == family.name:
if cache_size := family.size:
out.emit(
f"static_assert({cache_size} == "
@@ -831,7 +831,7 @@ class Analyzer:
def map_families(self) -> None:
"""Link instruction names back to their family, if they have one."""
for family in self.families.values():
- for member in family.members:
+ for member in [family.name] + family.members:
if member_instr := self.instrs.get(member):
if member_instr.family not in (family, None):
self.error(
@@ -855,8 +855,11 @@ class Analyzer:
- All members must have the same cache, input and output effects
"""
for family in self.families.values():
- if len(family.members) < 2:
- self.error(f"Family {family.name!r} has insufficient members", family)
+ if family.name not in self.macro_instrs and family.name not in self.instrs:
+ self.error(
+ f"Family {family.name!r} has unknown instruction {family.name!r}",
+ family,
+ )
members = [
member
for member in family.members
@@ -867,10 +870,8 @@ class Analyzer:
self.error(
f"Family {family.name!r} has unknown members: {unknown}", family
)
- if len(members) < 2:
- continue
- expected_effects = self.effect_counts(members[0])
- for member in members[1:]:
+ expected_effects = self.effect_counts(family.name)
+ for member in members:
member_effects = self.effect_counts(member)
if member_effects != expected_effects:
self.error(
@@ -1311,11 +1312,10 @@ class Analyzer:
self.out.emit("")
self.out.emit("_specializations = {")
for name, family in self.families.items():
- assert len(family.members) > 1
with self.out.indent():
- self.out.emit(f"\"{family.members[0]}\": [")
+ self.out.emit(f"\"{family.name}\": [")
with self.out.indent():
- for m in family.members[1:]:
+ for m in family.members:
self.out.emit(f"\"{m}\",")
self.out.emit(f"],")
self.out.emit("}")
@@ -1551,9 +1551,8 @@ class Analyzer:
self.out.emit(f"next_instr += {cache_adjust};")
if (
- last_instr
- and (family := last_instr.family)
- and mac.name == family.members[0]
+ (family := self.families.get(mac.name))
+ and mac.name == family.name
and (cache_size := family.size)
):
self.out.emit(
diff --git a/Tools/cases_generator/interpreter_definition.md b/Tools/cases_generator/interpreter_definition.md
index c03870e..f141848 100644
--- a/Tools/cases_generator/interpreter_definition.md
+++ b/Tools/cases_generator/interpreter_definition.md
@@ -347,7 +347,7 @@ For explanations see "Generating the interpreter" below.)
### Defining an instruction family
-A _family_ represents a specializable instruction and its specializations.
+A _family_ maps a specializable instruction to its specializations.
Example: These opcodes all share the same instruction format):
```C
diff --git a/Tools/cases_generator/test_generator.py b/Tools/cases_generator/test_generator.py
index e374ac4..e442734 100644
--- a/Tools/cases_generator/test_generator.py
+++ b/Tools/cases_generator/test_generator.py
@@ -287,7 +287,7 @@ def test_macro_instruction():
inst(OP3, (unused/5, arg2, left, right -- res)) {
res = op3(arg2, left, right);
}
- family(op, INLINE_CACHE_ENTRIES_OP) = { OP, OP3 };
+ family(OP, INLINE_CACHE_ENTRIES_OP) = { OP3 };
"""
output = """
TARGET(OP1) {