Enable filtering of signal matches
Provide tooling to enable specification of pre-implemented filtering
functors for signal matches.
Add a default 'none' filter to be used when a filter isn't specified.
Change-Id: I3549d8cf44c5f475626875fa94ca3ee8f74d6d26
Signed-off-by: Brad Bishop <bradleyb@fuzziesquirrel.com>
diff --git a/pimgen.py b/pimgen.py
index 15c91f6..8350d3a 100755
--- a/pimgen.py
+++ b/pimgen.py
@@ -38,9 +38,10 @@
class MatchRender(object):
- def __init__(self, name, signature):
+ def __init__(self, name, signature, fltr):
self.name = valid_c_name_pattern.sub('_', name).lower()
self.signature = signature
+ self.fltr = fltr
if self.name in all_names:
raise RuntimeError('The name "%s" is not unique.' % name)
@@ -58,20 +59,51 @@
fd.write(' std::make_tuple(\n')
for s in sig:
fd.write(' %s' % s)
- fd.write('\n')
+ fd.write(',\n')
+ self.fltr(fd)
fd.write(' ),\n')
fd.write(' },\n')
+class FilterRender(object):
+ namespace = 'filters'
+ default = 'none'
+
+ def __init__(self, fltr):
+ self.args = None
+ if fltr is None:
+ self.name = self.default
+ else:
+ self.name = fltr.get('name')
+ self.args = fltr.get('args')
+
+ def __call__(self, fd):
+ def fmt(x):
+ if x.get('type') is None:
+ return '"%s"' % x['value']
+ return str(x['value'])
+
+ fd.write(' %s::%s' % (self.namespace, self.name))
+ if self.args:
+ fd.write('(')
+ buf = ','.join(([fmt(x) for x in self.args]))
+ fd.write(buf)
+ fd.write(')')
+
+ fd.write('\n')
+
+
class MatchEventParse(object):
def __init__(self, match):
self.name = match['name']
self.signature = match['signature']
+ self.fltr = match.get('filter')
def __call__(self):
return MatchRender(
self.name,
- self.signature)
+ self.signature,
+ FilterRender(self.fltr))
class EventsParse(object):