|
1 | 1 | from __future__ import annotations
|
2 | 2 |
|
3 | 3 | import logging
|
| 4 | +from contextlib import contextmanager |
4 | 5 | from typing import TYPE_CHECKING, NamedTuple
|
5 | 6 |
|
6 | 7 | from ..cterm import CSubst, CTerm
|
7 | 8 | from ..kast.inner import KApply, KLabel, KRewrite, KVariable, Subst
|
8 | 9 | from ..kast.manip import flatten_label, free_vars
|
9 | 10 | from ..konvert import kast_to_kore, kore_to_kast
|
10 |
| -from ..kore.rpc import AbortedResult, SatResult, StopReason, UnknownResult, UnsatResult |
| 11 | +from ..kore.rpc import ( |
| 12 | + AbortedResult, |
| 13 | + KoreClient, |
| 14 | + KoreExecLogFormat, |
| 15 | + SatResult, |
| 16 | + StopReason, |
| 17 | + TransportType, |
| 18 | + UnknownResult, |
| 19 | + UnsatResult, |
| 20 | + kore_server, |
| 21 | +) |
11 | 22 | from ..prelude.k import GENERATED_TOP_CELL
|
12 | 23 | from ..prelude.ml import is_top, mlEquals, mlTop
|
13 | 24 |
|
14 | 25 | if TYPE_CHECKING:
|
15 |
| - from collections.abc import Iterable |
| 26 | + from collections.abc import Iterable, Iterator |
| 27 | + from pathlib import Path |
16 | 28 | from typing import Final
|
17 | 29 |
|
18 | 30 | from ..kast import KInner
|
19 | 31 | from ..kast.outer import KDefinition
|
20 | 32 | from ..kore.kompiled import KompiledKore
|
21 |
| - from ..kore.rpc import KoreClient, LogEntry |
| 33 | + from ..kore.rpc import FallbackReason, LogEntry |
22 | 34 | from ..kore.syntax import Pattern
|
| 35 | + from ..utils import BugReport |
23 | 36 |
|
24 | 37 |
|
25 | 38 | _LOGGER: Final = logging.getLogger(__name__)
|
@@ -228,3 +241,66 @@ def assume_defined(self, cterm: CTerm, module_name: str | None = None) -> CTerm:
|
228 | 241 | kast_simplified, logs = self.kast_simplify(kast, module_name=module_name)
|
229 | 242 | _LOGGER.debug(f'Definedness condition computed: {kast_simplified}')
|
230 | 243 | return cterm.add_constraint(kast_simplified)
|
| 244 | + |
| 245 | + |
| 246 | +@contextmanager |
| 247 | +def cterm_symbolic( |
| 248 | + definition: KDefinition, |
| 249 | + kompiled_kore: KompiledKore, |
| 250 | + definition_dir: Path, |
| 251 | + *, |
| 252 | + id: str | None = None, |
| 253 | + port: int | None = None, |
| 254 | + kore_rpc_command: str | Iterable[str] | None = None, |
| 255 | + llvm_definition_dir: Path | None = None, |
| 256 | + smt_timeout: int | None = None, |
| 257 | + smt_retry_limit: int | None = None, |
| 258 | + smt_tactic: str | None = None, |
| 259 | + bug_report: BugReport | None = None, |
| 260 | + haskell_log_format: KoreExecLogFormat = KoreExecLogFormat.ONELINE, |
| 261 | + haskell_log_entries: Iterable[str] = (), |
| 262 | + log_axioms_file: Path | None = None, |
| 263 | + trace_rewrites: bool = False, |
| 264 | + start_server: bool = True, |
| 265 | + maude_port: int | None = None, |
| 266 | + fallback_on: Iterable[FallbackReason] | None = None, |
| 267 | + interim_simplification: int | None = None, |
| 268 | + no_post_exec_simplify: bool = False, |
| 269 | +) -> Iterator[CTermSymbolic]: |
| 270 | + if start_server: |
| 271 | + # Old way of handling KoreServer, to be removed |
| 272 | + with kore_server( |
| 273 | + definition_dir=definition_dir, |
| 274 | + llvm_definition_dir=llvm_definition_dir, |
| 275 | + module_name=definition.main_module_name, |
| 276 | + port=port, |
| 277 | + command=kore_rpc_command, |
| 278 | + bug_report=bug_report, |
| 279 | + smt_timeout=smt_timeout, |
| 280 | + smt_retry_limit=smt_retry_limit, |
| 281 | + smt_tactic=smt_tactic, |
| 282 | + haskell_log_format=haskell_log_format, |
| 283 | + haskell_log_entries=haskell_log_entries, |
| 284 | + log_axioms_file=log_axioms_file, |
| 285 | + fallback_on=fallback_on, |
| 286 | + interim_simplification=interim_simplification, |
| 287 | + no_post_exec_simplify=no_post_exec_simplify, |
| 288 | + ) as server: |
| 289 | + with KoreClient('localhost', server.port, bug_report=bug_report, bug_report_id=id) as client: |
| 290 | + yield CTermSymbolic(client, definition, kompiled_kore, trace_rewrites=trace_rewrites) |
| 291 | + else: |
| 292 | + if port is None: |
| 293 | + raise ValueError('Missing port with start_server=False') |
| 294 | + if maude_port is None: |
| 295 | + dispatch = None |
| 296 | + else: |
| 297 | + dispatch = { |
| 298 | + 'execute': [('localhost', maude_port, TransportType.HTTP)], |
| 299 | + 'simplify': [('localhost', maude_port, TransportType.HTTP)], |
| 300 | + 'add-module': [ |
| 301 | + ('localhost', maude_port, TransportType.HTTP), |
| 302 | + ('localhost', port, TransportType.SINGLE_SOCKET), |
| 303 | + ], |
| 304 | + } |
| 305 | + with KoreClient('localhost', port, bug_report=bug_report, bug_report_id=id, dispatch=dispatch) as client: |
| 306 | + yield CTermSymbolic(client, definition, kompiled_kore, trace_rewrites=trace_rewrites) |
0 commit comments