www.pudn.com > noc.rar > netgen.py
import os, sys, string
if len(sys.argv) != 3 :
print 'Usage: python getnet.py '
sys.exit(1)
X, Y = map( int, sys.argv[1:3] )
name = 'NETWORK%dx%d'%(X,Y)
lname = string.lower(name)
hf = open(lname+'.h','w')
cf = open(lname+'.cpp','w')
##########################################################################################
hf.write('SC_MODULE(NETWORK%dx%d)\n{\n\n'%(X,Y))
hf.write('\tsc_in clk, rst;\n\n')
# ports of the network
for x in range(X):
for y in range(Y):
hf.write('\tsc_in< sc_bv > x%dy%ddin;\n'%(x,y))
hf.write('\tsc_out< sc_bv > x%dy%ddout;\n'%(x,y))
hf.write('\tsc_in< bool > x%dy%dreq_net;\n'%(x,y))
hf.write('\tsc_out< bool > x%dy%dack_net;\n'%(x,y))
hf.write('\tsc_in< bool > x%dy%dack_dp;\n'%(x,y))
hf.write('\tsc_out< bool > x%dy%dreq_dp;\n'%(x,y))
# routers
hf.write('\n')
for x in range(X):
for y in range(Y):
hf.write('\tECUBE_ROUTER *x%dy%d;\n'%(x,y))
# connections between routers
hf.write('\n')
for x in range(X):
for y in range(Y):
nn, nx, ny = 'x%dy%d'%(x,y),'x%dy%d'%((x+1)%X,y), 'x%dy%d'%(x,(y+1)%Y)
for p, n in ( (nn,nx), (nn,ny) ):
hf.write('\tsc_signal< sc_bv > %s_%s_data;\n'%(p,n))
signals = ( 'ch0req', 'ch0ack', 'ch1req', 'ch1ack' )
hf.write('\tsc_signal< bool > %s;\n'%(string.join( map(lambda s,p=p,n=n:'%s_%s_%s'%(p,n,s),signals), ', ')))
hf.write('\n')
# address signals for routers
for n in range(max(X,Y)):
hf.write( '\tsc_signal< sc_uint > addr%d;\n'%n)
# constructor
hf.write('\n\tSC_CTOR(NETWORK%dx%d){\n'%(X,Y))
# instantiate routers
for x in range(X):
for y in range(Y):
hf.write('\t\tx%dy%d = new ECUBE_ROUTER("x%dy%d");\n'%(x,y,x,y))
# address signals for routers
hf.write('\n')
for n in range(max(X,Y)):
hf.write( '\t\taddr%d = %d;\n'%(n,n))
# connect routers to previous and next in both dimensions
hf.write('\n')
for x in range(X):
for y in range(Y):
n, nx, ny, px, py = 'x%dy%d'%(x,y), 'x%dy%d'%((x+1)%X,y), 'x%dy%d'%(x,(y+1)%Y), 'x%dy%d'%((x-1)%X,y), 'x%dy%d'%(x,(y-1)%Y)
hf.write('\t\t%s->clk(clk); %s->rst(rst);\n'%(n,n))
hf.write('\t\t%s->xaddr(addr%d); %s->yaddr(addr%d);\n'%(n,x,n,y))
hf.write('\t\t%s->din(%sdin); %s->dout(%sdout);\n'%(n,n,n,n))
hf.write('\t\t%s->dreq_in(%sreq_net); %s->dack_out(%sack_net);\n'%(n,n,n,n))
hf.write('\t\t%s->dreq_out(%sreq_dp); %s->dack_in(%sack_dp);\n'%(n,n,n,n))
hf.write('\t\t%s->xin(%s_%s_data);\n'%(n,px,n))
hf.write('\t\t%s->x0req_in(%s_%s_ch0req); %s->x0ack_out(%s_%s_ch0ack);\n'%(n,px,n,n,px,n))
hf.write('\t\t%s->xout(%s_%s_data);\n'%(n,n,nx))
hf.write('\t\t%s->x0req_out(%s_%s_ch0req); %s->x0ack_in(%s_%s_ch0ack);\n'%(n,n,nx,n,n,nx))
hf.write('\t\t%s->yin(%s_%s_data);\n'%(n,py,n))
hf.write('\t\t%s->y0req_in(%s_%s_ch0req); %s->y0ack_out(%s_%s_ch0ack);\n'%(n,py,n,n,py,n))
hf.write('\t\t%s->yout(%s_%s_data);\n'%(n,n,ny))
hf.write('\t\t%s->y0req_out(%s_%s_ch0req); %s->y0ack_in(%s_%s_ch0ack);\n'%(n,n,ny,n,n,ny))
hf.write('\t\t%s->x1req_in(%s_%s_ch1req); %s->x1ack_out(%s_%s_ch1ack);\n'%(n,px,n,n,px,n))
hf.write('\t\t%s->x1req_out(%s_%s_ch1req); %s->x1ack_in(%s_%s_ch1ack);\n'%(n,n,nx,n,n,nx))
hf.write('\t\t%s->y1req_in(%s_%s_ch1req); %s->y1ack_out(%s_%s_ch1ack);\n'%(n,py,n,n,py,n))
hf.write('\t\t%s->y1req_out(%s_%s_ch1req); %s->y1ack_in(%s_%s_ch1ack);\n'%(n,n,ny,n,n,ny))
hf.write('\n')
hf.write('\t}\n};\n\n')
##########################################################################################
# network testbench
# network variable
cf.write('\t%s %s("%s");\n\n'%(name,lname,lname))
# signal connected to ports of network
for x in range(X):
for y in range(Y):
cf.write('\tsc_signal< sc_bv > x%dy%ddin;\n'%(x,y))
cf.write('\tsc_signal< sc_bv > x%dy%ddout;\n'%(x,y))
cf.write('\tsc_signal< bool > x%dy%dreq_net;\n'%(x,y))
cf.write('\tsc_signal< bool > x%dy%dack_net;\n'%(x,y))
cf.write('\tsc_signal< bool > x%dy%dack_dp;\n'%(x,y))
cf.write('\tsc_signal< bool > x%dy%dreq_dp;\n\n'%(x,y))
# connect signals to net
cf.write('\t%s.clk(clk); %s.rst(rst);\n'%(lname,lname))
for x in range(X):
for y in range(Y):
c = 'x%dy%d'%(x,y)
cf.write('\t%s.%sdin(%sdin);\n'%(lname,c,c))
cf.write('\t%s.%sdout(%sdout);\n'%(lname,c,c))
cf.write('\t%s.%sreq_net(%sreq_net);\n'%(lname,c,c))
cf.write('\t%s.%sack_net(%sack_net);\n'%(lname,c,c))
cf.write('\t%s.%sack_dp(%sack_dp);\n'%(lname,c,c))
cf.write('\t%s.%sreq_dp(%sreq_dp);\n\n'%(lname,c,c))
# create data processors
for x in range(X):
for y in range(Y):
c = 'x%dy%d'%(x,y)
d = 'dp_'+c
drv = 'drv%d%d'%(x,y)
cf.write('\tNETWORK_INTERFACE %s("%s");\n'%(d,d))
cf.write('\tNI_RAND_DRIVER %s("%s");\n'%(drv,drv))
# connect net signals to data processors
for x in range(X):
for y in range(Y):
c = 'x%dy%d'%(x,y)
d = 'dp_'+c
cf.write('\t%s.data_out(%sdin);\n'%(d,c))
cf.write('\t%s.data_in(%sdout);\n'%(d,c))
cf.write('\t%s.req_out(%sreq_net);\n'%(d,c))
cf.write('\t%s.ack_in(%sack_net);\n'%(d,c))
cf.write('\t%s.ack_out(%sack_dp);\n'%(d,c))
cf.write('\t%s.req_in(%sreq_dp);\n\n'%(d,c))
# create signals specific to data processors
for x in range(X):
for y in range(Y):
c = 'x%dy%d'%(x,y)
d = 'dp_'+c
drv = 'drv%d%d'%(x,y)
for s in ('reg_data_in','reg_data_out'):
cf.write('\tsc_signal< sc_bv<32> > %s_%s;\n'%(d,s))
for s in ('write_data','write_addr','send','read','data_rdy','send_rdy','packet_end', 'rcv_packet_end'):
cf.write('\tsc_signal< bool > %s_%s;\n'%(d,s))
cf.write('\tsc_signal %s_en;\n'%drv)
cf.write('\n')
# connect signals specific to data processors
for x in range(X):
for y in range(Y):
c = 'x%dy%d'%(x,y)
d = 'dp_'+c
drv = 'drv%d%d'%(x,y)
cf.write('\t%s.clk(clk); %s.rst(rst);\n'%(d,d))
cf.write('\t%s.clk(clk); %s.rst(rst); %s.en(%s_en);\n'%(drv,drv,drv,drv))
cf.write('\t%s.x = %d; %s.y = %d; %s.maxx = %d; %s.maxy = %d;\n'%(drv,x,drv,y,drv,X-1,drv,Y-1))
for s in ('reg_data_in','write_data','write_addr','send','read','reg_data_out','data_rdy','send_rdy','packet_end','rcv_packet_end'):
cf.write('\t%s.%s(%s_%s);\n'%(d,s,d,s))
cf.write('\t%s.%s(%s_%s);\n'%(drv,s,d,s))
cf.write('\n')
##########################################################################################
# tracing
cf.write('#ifndef NOVCD\n')
# network ports
for x in range(X):
for y in range(Y):
c = 'x%dy%d'%(x,y)
for s in ('din','dout','req_net','ack_net','req_dp','ack_dp'):
cf.write('\tsc_trace(tf, %s%s, "dp_%s.net.%s%s");\n'%(c,s,c,c,s))
cf.write('\n')
# internal connections within network
for x in range(X):
for y in range(Y):
nn, nx, ny = 'x%dy%d'%(x,y),'x%dy%d'%((x+1)%X,y), 'x%dy%d'%(x,(y+1)%Y)
for p, n in ( (nn,nx), (nn,ny) ):
for s in ( 'data', 'ch0req', 'ch0ack', 'ch1req', 'ch1ack' ):
cf.write('\tsc_trace(tf, %s.%s_%s_%s, "%s.%s_%s.%s_%s_%s");\n'%(lname,p,n,s,lname,p,n,p,n,s))
# tracing of routers
cf.write('\n')
cf.write('#ifdef ROUTERVCD\n')
for x in range(X):
for y in range(Y):
nn = 'x%dy%d'%(x,y)
for s in ('xydata','xyreq','xyack'):
cf.write('\tsc_trace(tf, %s.%s->%s, "%s.%s.%s");\n'%(lname,nn,s,lname,nn,s))
for r in ('xrouter', 'yrouter'):
for s in ( 'data0in','data1in','data2in','data0out','data1out','data2out',
'select0','select1','select2','rqs0','rqs1','rqs2',
'req0in','req1in','req2in','req0out','req1out','req2out',
'ack0in','ack1in','ack2in','ack0out','ack1out','ack2out',
'arb_data0','arb_data1','arb_req0','arb_req1','arb_ack0','arb_ack1' ):
cf.write('\tsc_trace(tf, %s.%s->%s->%s, "%s.%s.%s.conn.%s");\n'%(lname,nn,r,s,lname,nn,r,s))
cf.write('\n')
for i in ('d','x0','x1'):
for s in ('data_latch','current_state','next_state',
'header_select','end_of_route','start_of_packet','end_of_packet','header'):
cf.write('\tsc_trace(tf, %s.%s->%s->%sinctrl->%s, "%s.%s.%s.%sinctrl.%s");\n'%(lname,nn,r,i,s,lname,nn,r,i,s))
cf.write('\n')
for i in ('d','x0','x1'):
for s in ('current_state','next_state','buffer','buffer_write','buffer_clear'):
cf.write('\tsc_trace(tf, %s.%s->%s->%squeue->%s, "%s.%s.%s.%squeue.%s");\n'%(lname,nn,r,i,s,lname,nn,r,i,s))
cf.write('\n')
for s in ('arb_req0', 'arb_req1', 'arb_grant0', 'arb_grant1'):
cf.write('\tsc_trace(tf, %s.%s->%s->arbiter->%s, "%s.%s.%s.arbiter.%s");\n'%(lname,nn,r,s,lname,nn,r,s))
for i in '01' :
cf.write('\tsc_trace(tf, %s.%s->%s->arbiter->ch%sctrl->current_state, "%s.%s.%s.arbiter.ch%s.current_state");\n'%(lname,nn,r,i,lname,nn,r,i))
cf.write('\tsc_trace(tf, %s.%s->%s->arbiter->arbiter->channel_busy, "%s.%s.%s.arbiter.arbiter.channel_busy");\n'%(lname,nn,r,lname,nn,r))
cf.write('\tsc_trace(tf, %s.%s->%s->arbiter->arbiter->selected_channel, "%s.%s.%s.arbiter.arbiter.selected_channel");\n'%(lname,nn,r,lname,nn,r))
cf.write('\tsc_trace(tf, %s.%s->%s->swtch->grant0, "%s.%s.%s.switch.grant0");\n'%(lname,nn,r,lname,nn,r))
cf.write('\tsc_trace(tf, %s.%s->%s->swtch->grant1, "%s.%s.%s.switch.grant1");\n'%(lname,nn,r,lname,nn,r))
cf.write('\tsc_trace(tf, %s.%s->%s->swtch->grant2, "%s.%s.%s.switch.grant2");\n'%(lname,nn,r,lname,nn,r))
cf.write('\n')
cf.write('#endif\n\n')
# tracing data processors
for x in range(X):
for y in range(Y):
c = 'x%dy%d'%(x,y)
d = 'dp_'+c
for s in ('reg_data_in','write_data','write_addr','send','read','reg_data_out','data_rdy','send_rdy','packet_end','rcv_packet_end'):
cf.write('\tsc_trace(tf, %s_%s, "%s.%s");\n'%(d,s,d,s))
cf.write('\n')
for s in ('buffer_addr','buffer_in','buffer_out',
'send_flit','next_send_flit','send_current_state','send_next_state',
'rcv_flit','rcv_current_state'):
cf.write('\tsc_trace(tf, %s.%s, "%s.state.%s");\n'%(d,s,d,s))
cf.write('#endif\n')
hf.close()
cf.close()