else
{
const map<string, InterfaceBlock *> &blocks = stage->interface_blocks;
- map<string, InterfaceBlock *>::const_iterator i = blocks.find(var.name);
- if(i!=blocks.end() && i->second->instance_name==var.name)
+ map<string, InterfaceBlock *>::const_iterator i = blocks.find("_"+var.name);
+ if(i!=blocks.end())
{
/* The name refers to an interface block with an instance name rather
than a variable. Prepare a new syntax tree node accordingly. */
iface.declaration = 0;
for(Block *block=current_block; block; block=block->parent)
{
- map<string, InterfaceBlock *>::iterator i = stage->interface_blocks.find(iface.name);
+ map<string, InterfaceBlock *>::iterator i = stage->interface_blocks.find("_"+iface.name);
if(i!=stage->interface_blocks.end())
{
iface.declaration = i->second;
void VariableResolver::visit(StructDeclaration &strct)
{
TraversingVisitor::visit(strct);
- stage->types[strct.name] = &strct;
+ stage->types.insert(make_pair(strct.name, &strct));
}
void VariableResolver::visit(VariableDeclaration &var)
var.interface = block_interface;
TraversingVisitor::visit(var);
- current_block->variables[var.name] = &var;
+ current_block->variables.insert(make_pair(var.name, &var));
}
void VariableResolver::visit(InterfaceBlock &iface)
{
- /* Block names can't be used for any other identifiers so we can put them
- in the same map with instance names. */
- stage->interface_blocks[iface.name] = &iface;
+ /* Block names can be reused in different interfaces. Prefix the name with
+ the first character of the interface to avoid conflicts. */
+ stage->interface_blocks.insert(make_pair(iface.interface+iface.name, &iface));
if(!iface.instance_name.empty())
- stage->interface_blocks[iface.instance_name] = &iface;
+ stage->interface_blocks.insert(make_pair("_"+iface.instance_name, &iface));
SetForScope<string> set_iface(block_interface, iface.interface);
TraversingVisitor::visit(iface);
}
iface_target_block->body.insert(iface_insert_point, iface_var);
- iface_target_block->variables[name] = iface_var;
+ iface_target_block->variables.insert(make_pair(name, iface_var));
return iface_var;
}
InterfaceBlock *InterfaceGenerator::generate_interface(InterfaceBlock &out_block)
{
- if(stage->interface_blocks.count(out_block.name))
+ if(stage->interface_blocks.count("in"+out_block.name))
return 0;
InterfaceBlock *in_block = new InterfaceBlock;
}
iface_target_block->body.insert(iface_insert_point, in_block);
- stage->interface_blocks[in_block->name] = in_block;
+ stage->interface_blocks.insert(make_pair("in"+in_block->name, in_block));
if(!in_block->instance_name.empty())
- stage->interface_blocks[in_block->instance_name] = in_block;
+ stage->interface_blocks.insert(make_pair("_"+in_block->instance_name, in_block));
SetFlag set_scope(function_scope, false);
SetForScope<Block *> set_block(current_block, &stage->content);
}
const map<string, InterfaceBlock *> &prev_blocks = stage->previous->interface_blocks;
- map<string, InterfaceBlock *>::const_iterator j = prev_blocks.find(var.name);
- if(j!=prev_blocks.end() && j->second->interface=="out" && j->second->instance_name==var.name)
+ map<string, InterfaceBlock *>::const_iterator j = prev_blocks.find("_"+var.name);
+ if(j!=prev_blocks.end() && j->second->interface=="out")
{
generate_interface(*j->second);
+ /* Let VariableResolver convert the variable reference into an interface
+ block reference. */
return;
}
const map<string, VariableDeclaration *> &linked_vars = iface_block->linked_block->members.variables;
map<string, VariableDeclaration *>::const_iterator i = linked_vars.find(var.name);
if(i!=linked_vars.end())
+ {
var.linked_declaration = i->second;
+ var.linked_declaration->linked_declaration = &var;
+ }
}
return;
}
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)
+ map<string, InterfaceBlock *>::const_iterator i = prev_blocks.find("out"+iface.name);
+ if(i!=prev_blocks.end())
{
iface.linked_block = i->second;
i->second->linked_block = &iface;