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:
parent
916f300448
commit
df15a0368c
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
11
elaborate.cc
11
elaborate.cc
|
|
@ -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,
|
||||||
|
|
|
||||||
1
ivl.def
1
ivl.def
|
|
@ -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
|
||||||
|
|
|
||||||
19
ivl_target.h
19
ivl_target.h
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
44
net_tran.cc
44
net_tran.cc
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
||||||
19
netlist.h
19
netlist.h
|
|
@ -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);
|
||||||
|
|
|
||||||
27
t-dll-api.cc
27
t-dll-api.cc
|
|
@ -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;
|
||||||
|
|
|
||||||
2
t-dll.cc
2
t-dll.cc
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
2
t-dll.h
2
t-dll.h
|
|
@ -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;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue