Skip to content

Commit 02170e4

Browse files
committed
Merge remote-tracking branch 'origin/master' into release
2 parents 00eeaf4 + 161c1a6 commit 02170e4

File tree

1 file changed

+43
-28
lines changed

1 file changed

+43
-28
lines changed

kmir/src/kmir/kmir.py

Lines changed: 43 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -87,45 +87,61 @@ def kcfg_explore(self, label: str | None = None) -> Iterator[KCFGExplore]:
8787
) as cts:
8888
yield KCFGExplore(cts, kcfg_semantics=KMIRSemantics())
8989

90-
def make_call_config(
90+
def _make_concrete_call_config(self, smir_info: SMIRInfo, *, start_symbol: str = 'main') -> KInner:
91+
def init_subst() -> dict[str, KInner]:
92+
init_config = self.definition.init_config(KSort('GeneratedTopCell'))
93+
_, res = split_config_from(init_config)
94+
return res
95+
96+
if not start_symbol in smir_info.function_tys:
97+
raise KeyError(f'{start_symbol} not found in program')
98+
99+
args_info = smir_info.function_arguments[start_symbol]
100+
if args_info:
101+
raise ValueError(
102+
f'Cannot create concrete call configuration for {start_symbol}: function has parameters: {args_info}'
103+
)
104+
105+
# The configuration is the default initial configuration, with the K cell updated with the call terminator
106+
# TODO: see if this can be expressed in more simple terms
107+
subst = Subst(
108+
{
109+
**init_subst(),
110+
**{
111+
'K_CELL': mk_call_terminator(smir_info.function_tys[start_symbol], len(args_info)),
112+
},
113+
}
114+
)
115+
empty_config = self.definition.empty_config(KSort('GeneratedTopCell'))
116+
config = subst(empty_config)
117+
assert not free_vars(config), f'Config by construction should not have any free variables: {config}'
118+
return config
119+
120+
def _make_symbolic_call_config(
91121
self,
92122
smir_info: SMIRInfo,
93123
*,
94124
start_symbol: str = 'main',
95-
sort: str = 'GeneratedTopCell',
96-
init: bool = False,
97125
) -> tuple[KInner, list[KInner]]:
98126
if not start_symbol in smir_info.function_tys:
99127
raise KeyError(f'{start_symbol} not found in program')
100128

101129
args_info = smir_info.function_arguments[start_symbol]
102130
locals, constraints = symbolic_locals(smir_info, args_info)
103-
104-
_subst = {
105-
'K_CELL': mk_call_terminator(smir_info.function_tys[start_symbol], len(args_info)),
106-
'STACK_CELL': list_empty(), # FIXME see #560, problems matching a symbolic stack
107-
'LOCALS_CELL': list_of(locals),
108-
}
109-
110-
_init_subst: dict[str, KInner] = {}
111-
if init:
112-
_subst['LOCALS_CELL'] = list_empty()
113-
init_config = self.definition.init_config(KSort(sort))
114-
_, _init_subst = split_config_from(init_config)
115-
116-
for key in _init_subst:
117-
if key not in _subst:
118-
_subst[key] = _init_subst[key]
119-
120-
subst = Subst(_subst)
121-
config = self.definition.empty_config(KSort(sort))
122-
return (subst.apply(config), constraints)
131+
subst = Subst(
132+
{
133+
'K_CELL': mk_call_terminator(smir_info.function_tys[start_symbol], len(args_info)),
134+
'STACK_CELL': list_empty(), # FIXME see #560, problems matching a symbolic stack
135+
'LOCALS_CELL': list_of(locals),
136+
},
137+
)
138+
empty_config = self.definition.empty_config(KSort('GeneratedTopCell'))
139+
config = subst(empty_config)
140+
return config, constraints
123141

124142
def run_smir(self, smir_info: SMIRInfo, start_symbol: str = 'main', depth: int | None = None) -> Pattern:
125143
smir_info = smir_info.reduce_to(start_symbol)
126-
init_config, init_constraints = self.make_call_config(smir_info, start_symbol=start_symbol, init=True)
127-
if len(free_vars(init_config)) > 0 or len(init_constraints) > 0:
128-
raise ValueError(f'Cannot run function with variables: {start_symbol} - {free_vars(init_config)}')
144+
init_config = self._make_concrete_call_config(smir_info, start_symbol=start_symbol)
129145
init_kore = self.kast_to_kore(init_config, KSort('GeneratedTopCell'))
130146
result = self.run_pattern(init_kore, depth=depth)
131147
return result
@@ -135,10 +151,9 @@ def apr_proof_from_smir(
135151
id: str,
136152
smir_info: SMIRInfo,
137153
start_symbol: str = 'main',
138-
sort: str = 'GeneratedTopCell',
139154
proof_dir: Path | None = None,
140155
) -> APRProof:
141-
lhs_config, constraints = self.make_call_config(smir_info, start_symbol=start_symbol, sort=sort)
156+
lhs_config, constraints = self._make_symbolic_call_config(smir_info, start_symbol=start_symbol)
142157
lhs = CTerm(lhs_config, constraints)
143158

144159
var_config, var_subst = split_config_from(lhs_config)

0 commit comments

Comments
 (0)