Skip to content
This repository was archived by the owner on Apr 25, 2024. It is now read-only.

Commit 13b0b05

Browse files
committed
Revert hooks changes, store root attr on node
1 parent 85b64e8 commit 13b0b05

File tree

1 file changed

+28
-18
lines changed

1 file changed

+28
-18
lines changed

src/pyk/kcfg/kcfg.py

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55
from abc import ABC, abstractmethod
66
from collections.abc import Container
77
from dataclasses import dataclass, field
8+
from enum import Enum
89
from threading import RLock
9-
from typing import TYPE_CHECKING, Callable, List, Union, cast, final
10+
from typing import TYPE_CHECKING, List, Union, cast, final
1011

1112
from ..cterm import CSubst, CTerm, cterm_build_claim, cterm_build_rule
1213
from ..kast import EMPTY_ATT
@@ -41,6 +42,14 @@
4142
_LOGGER: Final = logging.getLogger(__name__)
4243

4344

45+
class NodeAttr(Enum):
46+
ROOT = 'root'
47+
VACUOUS = 'vacuous'
48+
STUCK = 'stuck'
49+
LEAF = 'leaf'
50+
SPLIT = 'split'
51+
52+
4453
class KCFGStore:
4554
store_path: Path
4655

@@ -79,21 +88,20 @@ def read_cfg_data(self) -> dict[str, Any]:
7988

8089

8190
class KCFG(Container[Union['KCFG.Node', 'KCFG.Successor']]):
82-
checkers: dict[str, Callable[[NodeIdLike], bool]]
83-
84-
def add_node_attr(self, attr_name: str, checker: Callable[[NodeIdLike], bool]) -> None:
85-
if attr_name in self.checkers:
86-
_LOGGER.warning(f'overriding attribute checking hook for {attr_name}.')
87-
self.checkers[attr_name] = checker
88-
8991
def compute_attrs(self, node_id: int) -> None:
92+
def check_root(_node_id: int) -> bool:
93+
return len(self.predecessors(_node_id)) == 0
94+
9095
node = self.node(node_id)
91-
node.attrs = [attr_name for attr_name, checker in self.checkers.items() if checker(node.id)]
96+
node.clear_attrs()
97+
98+
if check_root(node_id):
99+
node.add_attr(NodeAttr.ROOT)
92100

93101
class Node:
94102
id: int
95103
cterm: CTerm
96-
attrs: list[str]
104+
attrs: set[NodeAttr]
97105

98106
def __lt__(self, other: Any) -> bool:
99107
if not isinstance(other, KCFG.Node):
@@ -107,6 +115,15 @@ def __init__(self, id: int, cterm: CTerm) -> None:
107115
def to_dict(self) -> dict[str, Any]:
108116
return {'id': self.id, 'cterm': self.cterm.to_dict()}
109117

118+
def add_attr(self, attr: NodeAttr) -> None:
119+
self.attrs.add(attr)
120+
121+
def remove_attr(self, attr: NodeAttr) -> None:
122+
self.attrs.remove(attr)
123+
124+
def clear_attrs(self) -> None:
125+
self.attrs.clear()
126+
110127
class Successor(ABC):
111128
source: KCFG.Node
112129

@@ -372,12 +389,6 @@ def __init__(self, cfg_dir: Path | None = None, optimize_memory: bool = True) ->
372389
if cfg_dir is not None:
373390
self._kcfg_store = KCFGStore(cfg_dir)
374391

375-
self.add_node_attr('root', self.is_root)
376-
self.add_node_attr('vacious', self.is_vacuous)
377-
self.add_node_attr('stuck', self.is_stuck)
378-
self.add_node_attr('leaf', self.is_leaf)
379-
self.add_node_attr('split', self.is_split)
380-
381392
def __contains__(self, item: object) -> bool:
382393
if type(item) is KCFG.Node:
383394
return self.contains_node(item)
@@ -893,8 +904,7 @@ def remove_alias(self, alias: str) -> None:
893904
self._aliases.pop(alias)
894905

895906
def is_root(self, node_id: NodeIdLike) -> bool:
896-
node_id = self._resolve(node_id)
897-
return len(self.predecessors(node_id)) == 0
907+
return NodeAttr.ROOT in self.node(node_id).attrs
898908

899909
def is_vacuous(self, node_id: NodeIdLike) -> bool:
900910
node_id = self._resolve(node_id)

0 commit comments

Comments
 (0)