Collect NetTran devices into islands.

NetTran devices must be collected into islands because they are all
a bi-directional mass. This is how vvp will process them and the code
generator will need a head start organizing them.
This commit is contained in:
Stephen Williams 2008-06-01 19:45:12 -07:00
parent 916f300448
commit df15a0368c
10 changed files with 170 additions and 2 deletions

View File

@ -638,7 +638,8 @@ void NetTaskDef::dump(ostream&o, unsigned ind) const
void NetTran::dump_node(ostream&o, unsigned ind) const void NetTran::dump_node(ostream&o, unsigned ind) const
{ {
o << setw(ind) << "" << type_ << " " << name() << endl; o << setw(ind) << "" << type_ << " " << name()
<< " island " << island << endl;
dump_node_pins(o, ind+4); dump_node_pins(o, ind+4);
dump_obj_attr(o, ind+4); dump_obj_attr(o, ind+4);
} }

View File

@ -864,6 +864,17 @@ void PGBuiltin::elaborate(Design*des, NetScope*scope) const
} }
} }
// If these new nodes can belong to an island, then run tests
// to joind islands now.
if (dynamic_cast<IslandBranch*> (cur[0])) {
for (unsigned idx = 0 ; idx < count ; idx += 1) {
join_island(cur[idx]);
}
}
// "cur" is an array of pointers, and we don't need it any more.
delete[]cur;
} }
NetNet*PGModule::resize_net_to_port_(Design*des, NetScope*scope, NetNet*PGModule::resize_net_to_port_(Design*des, NetScope*scope,

View File

@ -224,6 +224,7 @@ ivl_switch_b
ivl_switch_basename ivl_switch_basename
ivl_switch_enable ivl_switch_enable
ivl_switch_file ivl_switch_file
ivl_switch_island
ivl_switch_lineno ivl_switch_lineno
ivl_switch_scope ivl_switch_scope
ivl_switch_type ivl_switch_type

View File

@ -80,6 +80,13 @@ _BEGIN_DECL
* processes. Structural expressions are instead treated as logic * processes. Structural expressions are instead treated as logic
* gates. * gates.
* *
* ivl_island_t
* Certain types of objects may belong to islands. The island that
* they belong to is represented by the ivl_island_t cookie. To
* know if object belong to the same island, it is sufficient to
* compare island cookies. If a==b, then island a is the same as
* island b.
*
* ivl_lpm_t * ivl_lpm_t
* This object is the base class for all the various LPM type * This object is the base class for all the various LPM type
* device nodes. This object carries a few base properties * device nodes. This object carries a few base properties
@ -146,6 +153,7 @@ typedef struct ivl_delaypath_s*ivl_delaypath_t;
typedef struct ivl_design_s *ivl_design_t; typedef struct ivl_design_s *ivl_design_t;
typedef struct ivl_event_s *ivl_event_t; typedef struct ivl_event_s *ivl_event_t;
typedef struct ivl_expr_s *ivl_expr_t; typedef struct ivl_expr_s *ivl_expr_t;
typedef struct ivl_island_s *ivl_island_t;
typedef struct ivl_lpm_s *ivl_lpm_t; typedef struct ivl_lpm_s *ivl_lpm_t;
typedef struct ivl_lval_s *ivl_lval_t; typedef struct ivl_lval_s *ivl_lval_t;
typedef struct ivl_net_const_s*ivl_net_const_t; typedef struct ivl_net_const_s*ivl_net_const_t;
@ -713,6 +721,16 @@ extern unsigned ivl_file_table_index(const char *);
extern unsigned ivl_file_table_size(void); extern unsigned ivl_file_table_size(void);
/* ISLAND
*
* ivl_island_flag_set
* ivl_island_flag_test
* Allow the user to test or set a boolean flag associated with the
* island.
*/
extern int ivl_island_flag_set(ivl_island_t net, int flag, int value);
extern int ivl_island_flag_test(ivl_island_t net, int flag);
/* LOGIC /* LOGIC
* These types and functions support manipulation of logic gates. The * These types and functions support manipulation of logic gates. The
* ivl_logic_t enumeration identifies the various kinds of gates that * ivl_logic_t enumeration identifies the various kinds of gates that
@ -1873,6 +1891,7 @@ extern const char*ivl_switch_basename(ivl_switch_t net);
extern ivl_nexus_t ivl_switch_a(ivl_switch_t net); extern ivl_nexus_t ivl_switch_a(ivl_switch_t net);
extern ivl_nexus_t ivl_switch_b(ivl_switch_t net); extern ivl_nexus_t ivl_switch_b(ivl_switch_t net);
extern ivl_nexus_t ivl_switch_enable(ivl_switch_t net); extern ivl_nexus_t ivl_switch_enable(ivl_switch_t net);
extern ivl_island_t ivl_switch_island(ivl_switch_t net);
/* Not implemented yet /* Not implemented yet
extern unsigned ivl_switch_attr_cnt(ivl_switch_t net); extern unsigned ivl_switch_attr_cnt(ivl_switch_t net);

44
ivl_target_priv.h Normal file
View File

@ -0,0 +1,44 @@
#ifndef __ivl_target_priv_H
#define __ivl_target_H
/*
* Copyright (c) 2008 Stephen Williams (steve@icarus.com)
*
* This source code is free software; you can redistribute it
* and/or modify it in source code form under the terms of the GNU
* General Public License as published by the Free Software
* Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*/
# include <inttypes.h>
/*
* This deader has declarations related to the ivl_target.h API that
* are not to be exported outside of the core via the ivl_target.h
* interface.
*/
/*
* Information about islands. Connected branches within a net are
* collected into islands. Branches that are purely ddiscrete do not
* have disciplines and do not belong to islands.
*/
class discipline_t;
struct ivl_island_s {
discipline_t*discipline;
// user accessible flags. They are initially false, always.
vector<bool> flags;
};
#endif

View File

@ -26,6 +26,7 @@
# include "compiler.h" # include "compiler.h"
# include "netlist.h" # include "netlist.h"
# include "netmisc.h" # include "netmisc.h"
# include "ivl_target_priv.h"
# include "ivl_assert.h" # include "ivl_assert.h"
static bool has_enable(ivl_switch_type_t tt) static bool has_enable(ivl_switch_type_t tt)
@ -55,3 +56,46 @@ NetTran::NetTran(NetScope*scope, perm_string n, ivl_switch_type_t tt)
NetTran::~NetTran() NetTran::~NetTran()
{ {
} }
void join_island(NetObj*obj)
{
IslandBranch*branch = dynamic_cast<IslandBranch*> (obj);
if (branch == 0)
return;
ivl_assert(*obj, branch->island == 0);
struct ivl_island_s*use_island = 0;
for (unsigned idx = 0 ; idx < obj->pin_count() ; idx += 1) {
Nexus*nex = obj->pin(idx).nexus();
for (Link*cur = nex->first_nlink() ; cur ; cur = cur->next_nlink()) {
unsigned pin;
NetObj*tmp;
cur->cur_link(tmp, pin);
if (tmp == obj)
continue;
IslandBranch*tmp_branch = dynamic_cast<IslandBranch*> (tmp);
if (tmp_branch == 0)
continue;
ivl_assert(*tmp, tmp_branch->island);
ivl_assert(*obj, use_island==0 || use_island==tmp_branch->island);
use_island = tmp_branch->island;
}
}
if (use_island == 0) {
use_island = new ivl_island_s;
use_island->discipline = 0;
if (debug_elaborate)
cerr << obj->get_fileline() << ": debug: "
<< "Create new island for this branch" << endl;
} else {
if (debug_elaborate)
cerr << obj->get_fileline() << ": debug: "
<< "Join this brach to existing island." << endl;
}
branch->island = use_island;
}

View File

@ -52,6 +52,7 @@ class Nexus;
class NetEvent; class NetEvent;
class NetNet; class NetNet;
class NetNode; class NetNode;
class NetObj;
class NetProc; class NetProc;
class NetProcTop; class NetProcTop;
class NetRelease; class NetRelease;
@ -71,6 +72,8 @@ struct functor_t;
ostream& operator << (ostream&o, ivl_variable_type_t val); ostream& operator << (ostream&o, ivl_variable_type_t val);
extern void join_island(NetObj*obj);
/* ========= /* =========
* A NetObj is anything that has any kind of behavior in the * A NetObj is anything that has any kind of behavior in the
* netlist. Nodes can be gates, registers, etc. and are linked * netlist. Nodes can be gates, registers, etc. and are linked
@ -131,6 +134,20 @@ class NetObj : public Attrib, public virtual LineInfo {
const NetExpr* delay3_; const NetExpr* delay3_;
}; };
/*
* Objects that can be island branches are derived from this. (It is
* possible for an object to be a NetObj and an IslandBranch.) This is
* used to collect island information about the node.
*/
class IslandBranch {
public:
IslandBranch() : island(0) { }
public:
struct ivl_island_s* island;
};
class Link { class Link {
friend void connect(Link&, Link&); friend void connect(Link&, Link&);
@ -1359,7 +1376,7 @@ class NetSysFunc : public NetNode {
const struct sfunc_return_type*def_; const struct sfunc_return_type*def_;
}; };
class NetTran : public NetNode { class NetTran : public NetNode, public IslandBranch {
public: public:
NetTran(NetScope*scope, perm_string n, ivl_switch_type_t type); NetTran(NetScope*scope, perm_string n, ivl_switch_type_t type);

View File

@ -555,6 +555,28 @@ extern "C" unsigned ivl_file_table_size()
return fn_vector.size(); return fn_vector.size();
} }
extern "C" int ivl_island_flag_set(ivl_island_t net, int flag, int value)
{
if (flag >= net->flags.size()) {
if (value == 0)
return 0;
else
net->flags.resize(flag+1, false);
}
int old_flag = net->flags[flag];
net->flags[flag] = value != 0;
return old_flag;
}
extern "C" int ivl_island_flag_test(ivl_island_t net, int flag)
{
if (flag >= net->flags.size())
return 0;
else
return net->flags[flag];
}
extern "C" const char* ivl_logic_attr(ivl_net_logic_t net, const char*key) extern "C" const char* ivl_logic_attr(ivl_net_logic_t net, const char*key)
{ {
assert(net); assert(net);
@ -2201,6 +2223,11 @@ extern "C" const char* ivl_switch_file(ivl_switch_t net)
return net->file; return net->file;
} }
extern "C" ivl_island_t ivl_switch_island(ivl_switch_t net)
{
return net->island;
}
extern "C" unsigned ivl_switch_lineno(ivl_switch_t net) extern "C" unsigned ivl_switch_lineno(ivl_switch_t net)
{ {
return net->lineno; return net->lineno;

View File

@ -1039,7 +1039,9 @@ bool dll_target::tran(const NetTran*net)
obj->type = net->type(); obj->type = net->type();
obj->name = net->name(); obj->name = net->name();
obj->scope = find_scope(des_, net->scope()); obj->scope = find_scope(des_, net->scope());
obj->island = net->island;
assert(obj->scope); assert(obj->scope);
assert(obj->island);
const Nexus*nex; const Nexus*nex;

View File

@ -21,6 +21,7 @@
# include "target.h" # include "target.h"
# include "ivl_target.h" # include "ivl_target.h"
# include "ivl_target_priv.h"
# include "StringHeap.h" # include "StringHeap.h"
# include "netlist.h" # include "netlist.h"
# include <vector> # include <vector>
@ -453,6 +454,7 @@ struct ivl_switch_s {
perm_string name; perm_string name;
ivl_scope_t scope; ivl_scope_t scope;
ivl_island_t island;
struct ivl_attribute_s*attr; struct ivl_attribute_s*attr;
unsigned nattr; unsigned nattr;