+void InterfaceGenerator::visit(InterfaceBlock &iface)
+{
+ if(iface.interface=="in")
+ {
+ if(!iface.linked_block && stage->previous)
+ {
+ const map<string, InterfaceBlock *> &prev_blocks = stage->previous->interface_blocks;
+ map<string, InterfaceBlock *>::const_iterator i = prev_blocks.find(iface.name);
+ if(i!=prev_blocks.end() && i->second->interface=="out" && i->second->name==iface.name)
+ {
+ iface.linked_block = i->second;
+ i->second->linked_block = &iface;
+ }
+ }
+ }
+
+ SetForScope<InterfaceBlock *> set_iface(iface_block, &iface);
+ TraversingVisitor::visit(iface);
+}
+
+void InterfaceGenerator::visit(FunctionDeclaration &func)
+{
+ SetFlag set_scope(function_scope, true);
+ // Skip parameters because they're not useful here
+ func.body.visit(*this);
+}
+