Add a predicate_key() method to all predicates.

This enables interning of predicates to avoid duplicates.

Add a predicate registry to TargetIsa for interning predicates per ISA.
This commit is contained in:
Jakob Stoklund Olesen
2017-07-26 09:30:29 -07:00
parent 6da734221a
commit 136cfe00dd
3 changed files with 59 additions and 12 deletions

View File

@@ -7,7 +7,7 @@ try:
from typing import Tuple, Set, List, Dict, Any, Union, TYPE_CHECKING # noqa
BoolOrPresetOrDict = Union['BoolSetting', 'Preset', Dict['Setting', Any]]
if TYPE_CHECKING:
from .predicates import PredLeaf, PredNode # noqa
from .predicates import PredLeaf, PredNode, PredKey # noqa
except ImportError:
pass
@@ -36,14 +36,6 @@ class Setting(object):
# type: () -> str
return '{}.{}'.format(self.group.name, self.name)
def predicate_context(self):
# type: () -> SettingGroup
"""
Return the context where this setting can be evaluated as a (leaf)
predicate.
"""
return self.group
def default_byte(self):
# type: () -> int
raise NotImplementedError("default_byte is an abstract method")
@@ -96,6 +88,19 @@ class BoolSetting(Setting):
# type: () -> int
return 1 << self.bit_offset
def predicate_context(self):
# type: () -> SettingGroup
"""
Return the context where this setting can be evaluated as a (leaf)
predicate.
"""
return self.group
def predicate_key(self):
# type: () -> PredKey
assert self.name, "Can't compute key before setting is named"
return ('setting', self.group.name, self.name)
def predicate_leafs(self, leafs):
# type: (Set[PredLeaf]) -> None
leafs.add(self)