From dc9e9db16047ec589a7b0488fac04c5bb682903c Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Wed, 26 Aug 2009 13:29:28 -0700 Subject: [PATCH] added rewrite methods to element to separate from validation logic --- grc/base/Block.py | 8 ++++++++ grc/base/Element.py | 4 +++- grc/base/FlowGraph.py | 11 ++++++++++- grc/gui/FlowGraph.py | 6 ++---- grc/python/Block.py | 7 ++++++- grc/python/Port.py | 14 ++++++++------ 6 files changed, 37 insertions(+), 13 deletions(-) diff --git a/grc/base/Block.py b/grc/base/Block.py index 491c594c..d2266e78 100644 --- a/grc/base/Block.py +++ b/grc/base/Block.py @@ -140,6 +140,14 @@ class Block(Element): """ self.get_param('_enabled').set_value(str(enabled)) + def rewrite(self): + """ + Rewrite critical structures. + Call rewrite on all sub elements. + """ + Element.rewrite(self) + for elem in self.get_ports() + self.get_params(): elem.rewrite() + def validate(self): """ Validate the block. diff --git a/grc/base/Element.py b/grc/base/Element.py index 16000c46..87cedb37 100644 --- a/grc/base/Element.py +++ b/grc/base/Element.py @@ -1,5 +1,5 @@ """ -Copyright 2008 Free Software Foundation, Inc. +Copyright 2008, 2009 Free Software Foundation, Inc. This file is part of GNU Radio GNU Radio Companion is free software; you can redistribute it and/or @@ -38,6 +38,8 @@ class Element(object): def add_error_message(self, msg): self._error_messages.append(msg) def get_error_messages(self): return self._error_messages + def rewrite(self): pass + def get_enabled(self): return True def get_parent(self): return self._parent diff --git a/grc/base/FlowGraph.py b/grc/base/FlowGraph.py index fe493cce..990baf02 100644 --- a/grc/base/FlowGraph.py +++ b/grc/base/FlowGraph.py @@ -147,6 +147,14 @@ class FlowGraph(Element): """ raise NotImplementedError + def rewrite(self): + """ + Rewrite critical structures. + Call rewrite on all sub elements. + """ + Element.rewrite(self) + for elem in self.get_elements(): elem.rewrite() + def validate(self): """ Validate the flow graph. @@ -198,7 +206,7 @@ class FlowGraph(Element): #only load the block when the block key was valid if block: block.import_data(block_n) else: Messages.send_error_load('Block key "%s" not found in %s'%(key, self.get_parent())) - self.validate() #validate all blocks before connections are made (in case of nports) + self.rewrite() #rewrite all blocks before connections are made (ex: nports) #build the connections for connection_n in connections_n: #try to make the connection @@ -225,3 +233,4 @@ class FlowGraph(Element): #build the connection self.connect(source, sink) except AssertionError: Messages.send_error_load('Connection between %s(%s) and %s(%s) could not be made.'%(source_block_id, source_key, sink_block_id, sink_key)) + self.rewrite() #global rewrite diff --git a/grc/gui/FlowGraph.py b/grc/gui/FlowGraph.py index 007bb622..5e645be7 100644 --- a/grc/gui/FlowGraph.py +++ b/grc/gui/FlowGraph.py @@ -291,12 +291,10 @@ class FlowGraph(Element): def update(self): """ + Do a global rewrite and validate. Call update on all elements. - Validate twice: - 1) elements call special rewrite rules that may break validation - 2) elements should come up with the same results, validation can pass """ - self.validate() + self.rewrite() self.validate() for element in self.get_elements(): element.update() diff --git a/grc/python/Block.py b/grc/python/Block.py index 47fe13a3..f47f7644 100644 --- a/grc/python/Block.py +++ b/grc/python/Block.py @@ -54,7 +54,6 @@ class Block(_Block): Validate this block. Call the base class validate. Evaluate the checks: each check must evaluate to True. - Adjust the nports. """ _Block.validate(self) #evaluate the checks @@ -65,6 +64,12 @@ class Block(_Block): try: assert check_eval except AssertionError: self.add_error_message('Check "%s" failed.'%check) except: self.add_error_message('Check "%s" did not evaluate.'%check) + + def rewrite(self): + """ + Add and remove ports to adjust for the nports. + """ + _Block.rewrite(self) #adjust nports for get_ports, get_port in ( (self.get_sources, self.get_source), diff --git a/grc/python/Port.py b/grc/python/Port.py index bfbac723..dde736db 100644 --- a/grc/python/Port.py +++ b/grc/python/Port.py @@ -57,17 +57,19 @@ class Port(_Port): except AssertionError: self.add_error_message('Port is not connected.') try: assert self.is_source() or len(self.get_enabled_connections()) <= 1 except AssertionError: self.add_error_message('Port has too many connections.') - ################################################################ - # message port logic - ################################################################ + #message port logic if self.get_type() == 'msg': try: assert not self.get_nports() except AssertionError: self.add_error_message('A port of type "msg" cannot have "nports" set.') try: assert self.get_vlen() == 1 except AssertionError: self.add_error_message('A port of type "msg" must have a "vlen" of 1.') - ################################################################ - # virtual sink logic - ################################################################ + + def rewrite(self): + """ + Handle the port cloning for virtual blocks. + """ + _Port.rewrite(self) + #virtual sink logic if self.get_parent().get_key() == 'virtual_sink': if self.get_enabled_connections(): #clone type and vlen source = self.get_enabled_connections()[0].get_source() -- 2.30.2