40 if len(mylist) > 0 : |
40 if len(mylist) > 0 : |
41 return reduce(lambda x, y: x + separator + y, mylist) |
41 return reduce(lambda x, y: x + separator + y, mylist) |
42 else : |
42 else : |
43 return mylist |
43 return mylist |
44 |
44 |
45 def generate_block(generator, block, block_infos, body, link, order=False): |
45 def generate_block(generator, block, block_infos, body, link, order=False, to_inout=False): |
46 body_type = body.getcontent()["name"] |
46 body_type = body.getcontent()["name"] |
47 name = block.getinstanceName() |
47 name = block.getinstanceName() |
48 type = block.gettypeName() |
48 type = block.gettypeName() |
49 executionOrderId = block.getexecutionOrderId() |
49 executionOrderId = block.getexecutionOrderId() |
|
50 inout_variables = {} |
|
51 for input_variable in block.inputVariables.getvariable(): |
|
52 for output_variable in block.outputVariables.getvariable(): |
|
53 if input_variable.getformalParameter() == output_variable.getformalParameter(): |
|
54 inout_variables[input_variable.getformalParameter()] = "" |
50 if block_infos["type"] == "function": |
55 if block_infos["type"] == "function": |
51 output_variables = block.outputVariables.getvariable() |
56 output_variables = block.outputVariables.getvariable() |
52 if not generator.ComputedBlocks.get(block, False) and not order: |
57 if not generator.ComputedBlocks.get(block, False) and not order: |
53 generator.ComputedBlocks[block] = True |
58 generator.ComputedBlocks[block] = True |
54 vars = [] |
59 vars = [] |
58 connections = variable.connectionPointIn.getconnections() |
63 connections = variable.connectionPointIn.getconnections() |
59 if connections is not None: |
64 if connections is not None: |
60 parameter = variable.getformalParameter() |
65 parameter = variable.getformalParameter() |
61 if parameter != "EN": |
66 if parameter != "EN": |
62 one_input_connected = True |
67 one_input_connected = True |
63 value = generator.ComputeExpression(body, connections, executionOrderId > 0) |
68 if inout_variables.has_key(parameter): |
|
69 value = generator.ComputeExpression(body, connections, executionOrderId > 0, True) |
|
70 inout_variables[parameter] = value |
|
71 else: |
|
72 value = generator.ComputeExpression(body, connections, executionOrderId > 0) |
64 if len(output_variables) > 1: |
73 if len(output_variables) > 1: |
65 vars.append([(parameter, input_info), |
74 vars.append([(parameter, input_info), |
66 (" := ", ())] + generator.ExtractModifier(variable, value, input_info)) |
75 (" := ", ())] + generator.ExtractModifier(variable, value, input_info)) |
67 else: |
76 else: |
68 vars.append(generator.ExtractModifier(variable, value, input_info)) |
77 vars.append(generator.ExtractModifier(variable, value, input_info)) |
69 if one_input_connected: |
78 if one_input_connected: |
70 for i, variable in enumerate(output_variables): |
79 for i, variable in enumerate(output_variables): |
71 parameter = variable.getformalParameter() |
80 parameter = variable.getformalParameter() |
72 if variable.getformalParameter() == "": |
81 if not inout_variables.has_key(parameter): |
73 variable_name = "%s%d"%(type, block.getlocalId()) |
82 if variable.getformalParameter() == "": |
74 else: |
83 variable_name = "%s%d"%(type, block.getlocalId()) |
75 variable_name = "%s%d_%s"%(type, block.getlocalId(), parameter) |
84 else: |
76 if generator.Interface[-1][0] != "VAR" or generator.Interface[-1][1] is not None or generator.Interface[-1][2]: |
85 variable_name = "%s%d_%s"%(type, block.getlocalId(), parameter) |
77 generator.Interface.append(("VAR", None, False, [])) |
86 if generator.Interface[-1][0] != "VAR" or generator.Interface[-1][1] is not None or generator.Interface[-1][2]: |
78 if variable.connectionPointOut in generator.ConnectionTypes: |
87 generator.Interface.append(("VAR", None, False, [])) |
79 generator.Interface[-1][3].append((generator.ConnectionTypes[variable.connectionPointOut], variable_name, None, None)) |
88 if variable.connectionPointOut in generator.ConnectionTypes: |
80 else: |
89 generator.Interface[-1][3].append((generator.ConnectionTypes[variable.connectionPointOut], variable_name, None, None)) |
81 generator.Interface[-1][3].append(("ANY", variable_name, None, None)) |
90 else: |
82 if len(output_variables) > 1 and parameter not in ["", "OUT"]: |
91 generator.Interface[-1][3].append(("ANY", variable_name, None, None)) |
83 vars.append([(parameter, (generator.TagName, "block", block.getlocalId(), "output", i)), |
92 if len(output_variables) > 1 and parameter not in ["", "OUT"]: |
84 (" => %s"%variable_name, ())]) |
93 vars.append([(parameter, (generator.TagName, "block", block.getlocalId(), "output", i)), |
85 else: |
94 (" => %s"%variable_name, ())]) |
86 output_info = (generator.TagName, "block", block.getlocalId(), "output", i) |
95 else: |
87 output_name = variable_name |
96 output_info = (generator.TagName, "block", block.getlocalId(), "output", i) |
|
97 output_name = variable_name |
88 generator.Program += [(generator.CurrentIndent, ()), |
98 generator.Program += [(generator.CurrentIndent, ()), |
89 (output_name, output_info), |
99 (output_name, output_info), |
90 (" := ", ()), |
100 (" := ", ()), |
91 (type, (generator.TagName, "block", block.getlocalId(), "type")), |
101 (type, (generator.TagName, "block", block.getlocalId(), "type")), |
92 ("(", ())] |
102 ("(", ())] |
100 connectionPoint = None |
110 connectionPoint = None |
101 for i, variable in enumerate(output_variables): |
111 for i, variable in enumerate(output_variables): |
102 blockPointx, blockPointy = variable.connectionPointOut.getrelPositionXY() |
112 blockPointx, blockPointy = variable.connectionPointOut.getrelPositionXY() |
103 if not connectionPoint or block.getx() + blockPointx == connectionPoint.getx() and block.gety() + blockPointy == connectionPoint.gety(): |
113 if not connectionPoint or block.getx() + blockPointx == connectionPoint.getx() and block.gety() + blockPointy == connectionPoint.gety(): |
104 output_info = (generator.TagName, "block", block.getlocalId(), "output", i) |
114 output_info = (generator.TagName, "block", block.getlocalId(), "output", i) |
105 output_name = variable.getformalParameter() |
115 parameter = variable.getformalParameter() |
106 if variable.getformalParameter() == "": |
116 if inout_variables.has_key(parameter): |
107 output_name = "%s%d"%(type, block.getlocalId()) |
117 output_value = inout_variables[parameter] |
108 else: |
118 else: |
109 output_name = "%s%d_%s"%(type, block.getlocalId(), variable.getformalParameter()) |
119 if parameter == "": |
110 return generator.ExtractModifier(variable, [(output_name, output_info)], output_info) |
120 output_name = "%s%d"%(type, block.getlocalId()) |
|
121 else: |
|
122 output_name = "%s%d_%s"%(type, block.getlocalId(), parameter) |
|
123 output_value = [(output_name, output_info)] |
|
124 return generator.ExtractModifier(variable, output_value, output_info) |
111 elif block_infos["type"] == "functionBlock": |
125 elif block_infos["type"] == "functionBlock": |
112 if not generator.ComputedBlocks.get(block, False) and not order: |
126 if not generator.ComputedBlocks.get(block, False) and not order: |
113 generator.ComputedBlocks[block] = True |
127 generator.ComputedBlocks[block] = True |
114 vars = [] |
128 vars = [] |
115 for i, variable in enumerate(block.inputVariables.getvariable()): |
129 for i, variable in enumerate(block.inputVariables.getvariable()): |
116 input_info = (generator.TagName, "block", block.getlocalId(), "input", i) |
130 input_info = (generator.TagName, "block", block.getlocalId(), "input", i) |
117 connections = variable.connectionPointIn.getconnections() |
131 connections = variable.connectionPointIn.getconnections() |
118 if connections is not None: |
132 if connections is not None: |
119 parameter = variable.getformalParameter() |
133 parameter = variable.getformalParameter() |
120 value = generator.ComputeExpression(body, connections, executionOrderId > 0) |
134 value = generator.ComputeExpression(body, connections, executionOrderId > 0, inout_variables.has_key(parameter)) |
121 vars.append([(parameter, input_info), |
135 vars.append([(parameter, input_info), |
122 (" := ", ())] + generator.ExtractModifier(variable, value, input_info)) |
136 (" := ", ())] + generator.ExtractModifier(variable, value, input_info)) |
123 generator.Program += [(generator.CurrentIndent, ()), |
137 generator.Program += [(generator.CurrentIndent, ()), |
124 (name, (generator.TagName, "block", block.getlocalId(), "name")), |
138 (name, (generator.TagName, "block", block.getlocalId(), "name")), |
125 ("(", ())] |
139 ("(", ())] |
131 connectionPoint = None |
145 connectionPoint = None |
132 for i, variable in enumerate(block.outputVariables.getvariable()): |
146 for i, variable in enumerate(block.outputVariables.getvariable()): |
133 blockPointx, blockPointy = variable.connectionPointOut.getrelPositionXY() |
147 blockPointx, blockPointy = variable.connectionPointOut.getrelPositionXY() |
134 if not connectionPoint or block.getx() + blockPointx == connectionPoint.getx() and block.gety() + blockPointy == connectionPoint.gety(): |
148 if not connectionPoint or block.getx() + blockPointx == connectionPoint.getx() and block.gety() + blockPointy == connectionPoint.gety(): |
135 output_info = (generator.TagName, "block", block.getlocalId(), "output", i) |
149 output_info = (generator.TagName, "block", block.getlocalId(), "output", i) |
136 return generator.ExtractModifier(variable, [("%s.%s"%(name, variable.getformalParameter()), output_info)], output_info) |
150 output_name = generator.ExtractModifier(variable, [("%s.%s"%(name, variable.getformalParameter()), output_info)], output_info) |
|
151 if to_inout: |
|
152 variable_name = "%s_%s"%(name, variable.getformalParameter()) |
|
153 if not generator.IsAlreadyDefined(variable_name): |
|
154 if generator.Interface[-1][0] != "VAR" or generator.Interface[-1][1] is not None or generator.Interface[-1][2]: |
|
155 generator.Interface.append(("VAR", None, False, [])) |
|
156 if variable.connectionPointOut in generator.ConnectionTypes: |
|
157 generator.Interface[-1][3].append((generator.ConnectionTypes[variable.connectionPointOut], variable_name, None, None)) |
|
158 else: |
|
159 generator.Interface[-1][3].append(("ANY", variable_name, None, None)) |
|
160 generator.Program += [(generator.CurrentIndent, ()), |
|
161 ("%s := "%variable_name, ())] |
|
162 generator.Program += output_name |
|
163 generator.Program += [(";\n", ())] |
|
164 return [(variable_name, ())] |
|
165 return output_name |
137 if link is not None: |
166 if link is not None: |
138 raise ValueError, _("No output variable found") |
167 raise ValueError, _("No output variable found") |
139 |
168 |
140 def initialise_block(type, name, block = None): |
169 def initialise_block(type, name, block = None): |
141 return [(type, name, None, None)] |
170 return [(type, name, None, None)] |