diff options
author | fahim | 2015-02-05 17:23:51 +0530 |
---|---|---|
committer | fahim | 2015-02-05 17:23:51 +0530 |
commit | 87016b9bd60a03eaaf1bd7f0816e27dbe96ef6ed (patch) | |
tree | eb6b6519729880f1a6bbbeccbdd486dd6afc1d6e /src/model_generation.py | |
download | nghdl-87016b9bd60a03eaaf1bd7f0816e27dbe96ef6ed.tar.gz nghdl-87016b9bd60a03eaaf1bd7f0816e27dbe96ef6ed.tar.bz2 nghdl-87016b9bd60a03eaaf1bd7f0816e27dbe96ef6ed.zip |
Subject: Adding all the source code of nghdl
Description: Adding all the source code of nghdl
Diffstat (limited to 'src/model_generation.py')
-rwxr-xr-x | src/model_generation.py | 750 |
1 files changed, 750 insertions, 0 deletions
diff --git a/src/model_generation.py b/src/model_generation.py new file mode 100755 index 0000000..d21de69 --- /dev/null +++ b/src/model_generation.py @@ -0,0 +1,750 @@ +#!/usr/bin/env python + +"""#!/usr/bin/python """ +import re +import sys +import os + +#######Script start from here +print "Arguement is :", sys.argv[1] +fname = os.path.basename(sys.argv[1]) +print "VHDL filename is :",fname +home = os.path.expanduser("~") +###########Creating connection_info.txt file from vhdl file##################### +read_vhdl = open(sys.argv[1],'r') +vhdl_data = read_vhdl.readlines() +read_vhdl.close() + +start_flag = -1 #Used for scaning part of data +scan_data=[] +#p=re.search('port(.*?)end',read_vhdl,re.M|re.I|re.DOTALL).group() + +for item in vhdl_data: + if re.search('port',item,re.I): + start_flag = 1 + + elif re.search("end",item,re.I): + start_flag = 0 + else: + pass + + if start_flag == 1: + item=re.sub("port", " ", item, flags=re.I) + item=re.sub("\(", " ", item, flags=re.I) + item=re.sub("\)", " ", item, flags=re.I) + item=re.sub(";"," ",item,flags=re.I) + + scan_data.append(item.rstrip()) + scan_data=filter(None, scan_data) + elif start_flag == 0: + break + +#print "Scan Data",scan_data +port_info=[] + +for item in scan_data: + print "Scan Data :",item + if re.search("in",item,flags=re.I): + if re.search("std_logic_vector",item,flags=re.I): + temp=re.compile(r"\s*std_logic_vector\s*",flags=re.I) + elif re.search("std_logic",item,flags=re.I): + temp=re.compile(r"\s*std_logic\s*",flags=re.I) + else: + print "Please check your vhdl code for datatype of input port" + sys.exit() + elif re.search("out",item,flags=re.I): + if re.search("std_logic_vector",item,flags=re.I): + temp=re.compile(r"\s*std_logic_vector\s*",flags=re.I) + elif re.search("std_logic",item,flags=re.I): + temp=re.compile(r"\s*std_logic\s*",flags=re.I) + else: + print "Please check your vhdl code for datatype of output port" + sys.exit() + else: + print "Please check the in/out direction of your port" + sys.exit() + + lhs=temp.split(item)[0] + rhs=temp.split(item)[1] + bit_info=re.compile(r"\s*downto\s*",flags=re.I).split(rhs)[0] + port_info.append(lhs+":"+str(int(bit_info)+int(1))) + +print "Port Info :",port_info + +#Open connection_info.txt file + +con_ifo=open('connection_info.txt','w') + +for item in port_info: + word=item.split(':') + con_ifo.write(word[0].strip()+' '+word[1].strip()+' '+word[2].strip()) + con_ifo.write("\n") +con_ifo.close() +############### Reading connection/port information############################# + +#Declaring input and output list +input_list=[] +output_list=[] + +#Reading connection_info.txt file for port infomation +read_file=open('connection_info.txt','r') +data=read_file.readlines() +read_file.close() + +#Extracting input and output port list from data +for line in data: + if re.match(r'^\s*$', line): + pass + #print "Blank Line" + else: + in_items=re.findall("IN",line,re.MULTILINE|re.IGNORECASE) + out_items=re.findall("OUT",line,re.MULTILINE|re.IGNORECASE) + #print "Line",line + if in_items: + input_list.append(line.split()) + #print "Found IN" + else: + pass + #print "Not Found" + + if out_items: + output_list.append(line.split()) + #print "Found Out" + else: + pass + +print "Inout List :",input_list +print "Output list",output_list +input_port=[] +output_port=[] +#creating list of input and output port with its weight +for input in input_list: + input_port.append(input[0]+":"+input[2]) + #print "Input List: ",input +for output in output_list: + output_port.append(output[0]+":"+output[2]) + #print "Output List: ",output + +print "Output Port List : ",output_port +print "Input Port List : ",input_port + +######################Creating content for cfunc.mod file####################### +print "Starting With cfunc.mod file" +cfunc=open('cfunc.mod','w') + +print "Building content for cfunc.mod file" + +comment='''/* This is cfunc.mod file auto generated by gen_con_info.py +Developed by Fahim at IIT Bombay */ \n + ''' + +header=''' +#include <stdio.h> +#include <math.h> +#include <string.h> +#include <time.h> +#include <sys/socket.h> +#include <sys/types.h> +#include <netinet/in.h> +#include <netdb.h> +#include <stdlib.h> +#include <unistd.h> +#include <errno.h> +''' + +function_open='''void cm_'''+fname.split('.')[0]+'''(ARGS) \n{''' + +digital_state_output=[] +for item in output_port: + digital_state_output.append("Digital_State_t *_op_"+item.split(':')[0]+", *_op_"+item.split(':')[0]+"_old;") + + +var_section=''' + // Declaring components of Client + static int flag=0; + FILE *log_client = NULL; + log_client=fopen("client.log","a"); + int socket_fd, bytes_recieved; + char send_data[1024]; + char recv_data[1024]; + struct hostent *host; + struct sockaddr_in server_addr; + double time_limit = PARAM(stop_time); +''' +temp_input_var=[] +for item in input_port: + temp_input_var.append("char temp_"+item.split(':')[0]+"[1024];") + +#Start of INIT function +init_start_function=''' + if(INIT) + { + /* Allocate storage for output ports.And set the load for input ports */ +''' + +cm_event_alloc=[] +cm_count_output=0 +for item in output_port: + cm_event_alloc.append("cm_event_alloc("+str(cm_count_output)+","+item.split(':')[1]+"*sizeof(Digital_State_t));") + cm_count_output=cm_count_output+1 + +load_in_port=[] +for item in input_port: + load_in_port.append("for(Ii=0;Ii<PORT_SIZE("+item.split(':')[0]+");Ii++)\n\t\t{\n\t\t\tLOAD("+item.split(':')[0]+"[Ii])=PARAM(input_load); \n\t\t}") + +cm_count_ptr=0 +cm_event_get_ptr=[] +for item in output_port: + cm_event_get_ptr.append("_op_"+item.split(':')[0]+" = _op_"+item.split(':')[0]+"_old = (Digital_State_t *) cm_event_get_ptr("+str(cm_count_ptr)+",0);") + cm_count_ptr=cm_count_ptr+1 + +systime_info=''' + /*Taking system time info for log */ + time_t systime; + systime = time(NULL); + printf(ctime(&systime)); + printf("Client-Initialising ngspice \\n"); + fprintf(log_client,"Setup Client Server Connection at %s \\n",ctime(&systime)); +''' + +init_else=''' + printf("Client-Inside else of INIT \\n"); + fprintf(log_client,"Inside else of INIT \\n"); + /* retrieve storage for output ports. */ +''' + +els_evt_count1=0 +els_evt_count2=0 +els_evt_ptr=[] +for item in output_port: + els_evt_ptr.append("_op_"+item.split(":")[0]+" = cm_event_get_ptr("+str(els_evt_count1)+","+str(els_evt_count2)+");") + els_evt_count2=els_evt_count2+1 + els_evt_ptr.append("_op_"+item.split(":")[0]+"_old"+" = cm_event_get_ptr("+str(els_evt_count1)+","+str(els_evt_count2)+");") + els_evt_count1=els_evt_count1+1 + + +client_setup=''' + /* Client setup */ + //Default hostname assignment + host = gethostbyname("127.0.0.1"); + printf("Client-Creating Client Socket \\n"); + fprintf(log_client,"Creating client socket \\n"); +''' +create_socket=''' + //Creating socket for client + if ((socket_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) + { + perror("Client-Error while creating client Socket \\n"); + fprintf(log_client,"Error while creating client sockte \\n"); + exit(1); + } + + printf("Client-Client Socket created successfully \\n"); + printf("Client- Socket Id : %d \\n",socket_fd); + fprintf(log_client,"Client-Client Socket created successfully \\n"); + fprintf(log_client,"Client- Socket Id : %d \\n",socket_fd); + + // memset(&server_addr, 0, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(5000); + server_addr.sin_addr = *((struct in_addr *)host->h_addr); + bzero(&(server_addr.sin_zero),8); + +''' + +connect_server=''' + printf("Client-Connecting to server \\n"); + fprintf(log_client,"Client-Connecting to server \\n"); + //Conneting to server + + int try_limit=10; + while(try_limit>0) + { + if (connect(socket_fd, (struct sockaddr*)&server_addr,sizeof(struct sockaddr)) == -1) + { + sleep(1); + try_limit--; + if(try_limit==0) + { + fprintf(stderr,"Connect- Error:Tried to connect server on port , failed..giving up \\n"); + fprintf(log_client,"Connect- Error:Tried to connect server on port , failed..giving up \\n"); + exit(1); + } + } + else + { + printf("Client-Connected to server \\n"); + fprintf(log_client,"Client-Connected to server \\n"); + break; + } + } + +''' + +time_limit =''' + if(TIME < time_limit) + { + //Formating data for sending it to client + int Ii; + +''' +#Assign bit value to every input +assign_data_to_input=[] +for item in input_port: + assign_data_to_input.append("\t\t\tfor(Ii=0;Ii<PORT_SIZE("+item.split(':')[0]+");Ii++)\n\ +\t\t\t{\n\t\t\t\tif( INPUT_STATE("+item.split(':')[0]+"[Ii])==ZERO )\n\ +\t\t\t\t{\n\t\t\t\t\ttemp_"+item.split(':')[0]+"[Ii]='0';\n\t\t\t\t}\n\ +\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttemp_"+item.split(':')[0]+"[Ii]='1';\n\ +\t\t\t\t}\n\t\t\t}\n\t\t\ttemp_"+item.split(':')[0]+"[Ii]='\\0';\n\n") + + +snprintf_stmt=[] +snprintf_count=0 +snprintf_stmt.append("\t\t\t//Sending and receiving data to-from server \n") +snprintf_stmt.append('\t\t\tsnprintf(send_data,sizeof(send_data),"') +for item in input_port: + snprintf_count=snprintf_count+1 + snprintf_stmt.append(item.split(':')[0]+":%s") + if snprintf_count == len(input_port): + snprintf_stmt.append('",') + internal_count=0 + for item1 in input_port: + if internal_count == len(input_port): + pass + else: + snprintf_stmt.append("temp_"+item1.split(':')[0]) + internal_count=internal_count+1 + if internal_count == len(input_port): + pass + else: + snprintf_stmt.append(",") + snprintf_stmt.append(");") + else: + snprintf_stmt.append(",") + +snprintf_stmt.append('\n\t\t\tprintf("Client-Value of buffer string is %s \\n",send_data);') +snprintf_stmt.append('\n\t\t\tprintf("Client-Sending data to server from client \\n");') + +send_data=''' + + if ( send(socket_fd,send_data,sizeof(send_data),0)==-1) + { + fprintf(stderr, "Client-Failure Sending Message \\n"); + close(socket_fd); + exit(1); + } + else + { + printf("Client-Message being sent: %s \\n",send_data); + fprintf(log_client,"Socket Id : %d & Message sent : %s \\n",socket_fd,send_data); + } + +''' + +recv_data=''' + + bytes_recieved=recv(socket_fd,recv_data,sizeof(recv_data),0); + if ( bytes_recieved <= 0 ) + { + printf("Client-Either Connection Closed or Error \\n"); + exit(1); + } + //recv_data[bytes_recieved] = '\\0'; + + printf("Client-Message Received From Server - %s\\n",recv_data); + fprintf(log_client,"Message Received From Server- %s\\n",recv_data); + +''' + +#Scheduling output event + +sch_output_event=[] + +for item in output_port: + sch_output_event.append("\t\t\t/* Scheduling event and processing them */\n\ +\t\t\tfor(Ii=0;Ii<PORT_SIZE("+item.split(':')[0]+");Ii++)\n\ +\t\t\t{\n\ +\t\t\t\tprintf(\"Client- Bit val is %c \\n\",recv_data[Ii]);\n\ +\t\t\t\tfprintf(log_client,\"Client-Bit val is %c \\n\",recv_data[Ii]);\n\ +\t\t\t\tif(recv_data[Ii]=='0')\n\t\t\t\t{\n\ +\t\t\t\t\tprintf(\"Client-Zero Received \");\n\ +\t\t\t\t\t_op_"+item.split(':')[0]+"[Ii]=ZERO;\n\t\t\t\t}\n\ +\t\t\t\telse if(recv_data[Ii]=='1')\n\t\t\t\t{\n\ +\t\t\t\t\tprintf(\"Client-One Received \\n\");\n\ +\t\t\t\t\t_op_"+item.split(':')[0]+"[Ii]=ONE;\n\ +\t\t\t\t}\n\t\t\t\telse\t\t\t\t{\n\ +\t\t\t\t\tfprintf(log_client,\"Unknow value return from server \\n\");\n\ +\t\t\t\t\tprintf(\"Client-Unknown value return \\n\");\n\t\t\t\t}\n\ +\t\t\t\tif(ANALYSIS == DC)\n\t\t\t\t{\n\ +\t\t\t\t\tOUTPUT_STATE("+item.split(':')[0]+"[Ii]) = _op_"+item.split(':')[0]+"[Ii];\n\ +\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\ +\t\t\t\t\tif(_op_"+item.split(':')[0]+"[Ii] != _op_"+item.split(':')[0]+"_old[Ii])\n\ +\t\t\t\t\t{\n\ +\t\t\t\t\t\tOUTPUT_STATE("+item.split(':')[0]+"[Ii]) = _op_"+item.split(':')[0]+"[Ii];\n\ +\t\t\t\t\t\tOUTPUT_DELAY("+item.split(':')[0]+"[Ii]) = ((_op_"+item.split(':')[0]+"[Ii] == ZERO) ? PARAM(fall_delay) : PARAM(rise_delay));\n\ +\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\ +\t\t\t\t\t\tOUTPUT_CHANGED("+item.split(':')[0]+"[Ii]) = FALSE;\n\t\t\t\t\t}\n\ +\t\t\t\t}\n\t\t\t\tOUTPUT_STRENGTH("+item.split(':')[0]+"[Ii]) = STRONG;\n\ +\t\t\t}\n") + + +els_time_limit=''' + + else + { + char *end_signal="END"; + printf("Closing Ngspice Simulation \\n"); + printf("current time = %g\\n",TIME); + fprintf(log_client,"Times : Closing Socket \\n"); + snprintf(send_data,sizeof(send_data),"%s",end_signal); + printf("Client-Value of buffer string is for END signal is %s \\n",send_data); + printf("Client-Sending data to server from client for end signal \\n"); + + if ( send(socket_fd,send_data,sizeof(send_data),0)==-1) + { + printf("Client-Failure Sending Message for END signal \\n"); + close(socket_fd); + exit(1); + } + else + { + printf("Client-Message being sent for END signal : %s\\n",send_data); + fprintf(log_client,"Socket Id : %d & Message sent : %s for END signal \\n",socket_fd,send_data); + } + flag++; + close(socket_fd); + } + +''' + + +#Writing content in cfunc.mod file +cfunc.write(comment) +cfunc.write(header) +cfunc.write("\n") +cfunc.write(function_open) +cfunc.write("\n") + +#Adding digital state Variable +for item in digital_state_output: + cfunc.write("\t"+item+"\n") + +#Adding variable declaration section +cfunc.write(var_section) +for item in temp_input_var: + cfunc.write("\t"+item+"\n") +cfunc.write("\n"); + +#Adding INIT portion +cfunc.write(init_start_function) +for item in cm_event_alloc: + cfunc.write(2*"\t"+item) + cfunc.write("\n") + +cfunc.write(2*"\t"+"/* set the load for input ports. */") +cfunc.write("\n") +cfunc.write(2*"\t"+"int Ii;") +cfunc.write("\n"); + +for item in load_in_port: + cfunc.write(2*"\t"+item) + cfunc.write("\n") +cfunc.write("\n") +cfunc.write(2*"\t"+"/*Retrieve Storage for output*/") +cfunc.write("\n") +for item in cm_event_get_ptr: + cfunc.write(2*"\t"+item) + cfunc.write("\n") +cfunc.write(systime_info) +cfunc.write("\n") +cfunc.write('\t\tsystem("'+home+'/ngspice-26/src/xspice/icm/ghdl/'+fname.split('.')[0]+'/DUTghdl/start_server.sh &");\n') +cfunc.write("\t}") +cfunc.write("\n") +cfunc.write("\telse\n\t{\n") + +for item in els_evt_ptr: + cfunc.write(2*"\t"+item) + cfunc.write("\n") +cfunc.write("\t}") +cfunc.write("\n\n") +cfunc.write("\tif(flag==0)\n\t{") +cfunc.write(client_setup) +cfunc.write(create_socket) +cfunc.write(connect_server) +cfunc.write(time_limit) + +for item in assign_data_to_input: + cfunc.write(item) + +for item in snprintf_stmt: + cfunc.write(item) + +cfunc.write(send_data) +cfunc.write(recv_data) + +for item in sch_output_event: + cfunc.write(item) +#End of if statement of time limit +cfunc.write(2*"\t"+"}") + +#Else part of time limit -sending END signal +cfunc.write(els_time_limit) + +#Close if of flag==0 +cfunc.write("\t}\n\n") + +#close log_client file +cfunc.write("\tfclose(log_client);") + +#Close cm_ function +cfunc.write("\n}") +cfunc.close() + +################Creating ifspec.ifs file######################################## +print "Starting with ifspec.ifs file" +ifspec=open('ifspec.ifs','w') + +print "Gathering Al the content for ifspec file" + +ifspec_comment=''' +/* +SUMMARY: This file is auto generated and it contains the interface specification for the +code model. */\n +''' + +name_table='NAME_TABLE:\n\ +C_Function_Name: cm_'+fname.split('.')[0]+'\n\ +Spice_Model_Name: '+fname.split('.')[0]+'\n\ +Description: "Model generated from ghdl code '+fname+'" \n' + +#Input and Output Port Table +in_port_table=[] +out_port_table=[] + +for item in input_port: + port_table = 'PORT_TABLE:\n' + port_name = 'Port_Name:\t'+item.split(':')[0]+'\n' + description = 'Description:\t"input port '+item.split(':')[0]+'"\n' + direction = 'Direction:\tin\n' + default_type = 'Default_Type:\td\n' + allowed_type = 'Allowed_Types:\t[d]\n' + vector = 'Vector:\tyes\n' + vector_bounds = 'Vector_Bounds:\t['+item.split(':')[1]+' '+item.split(":")[1]+']\n' + null_allowed = 'Null_Allowed:\tno\n' + #Insert detail in the list + in_port_table.append(port_table+port_name+description+direction+default_type+allowed_type+vector+vector_bounds+null_allowed) + + +for item in output_port: + port_table = 'PORT_TABLE:\n' + port_name = 'Port_Name:\t'+item.split(':')[0]+'\n' + description = 'Description:\t"output port '+item.split(':')[0]+'"\n' + direction = 'Direction:\tout\n' + default_type = 'Default_Type:\td\n' + allowed_type = 'Allowed_Types:\t[d]\n' + vector = 'Vector:\tyes\n' + vector_bounds = 'Vector_Bounds:\t['+item.split(':')[1]+' '+item.split(":")[1]+']\n' + null_allowed = 'Null_Allowed:\tno\n' + #Insert detail in the list + in_port_table.append(port_table+port_name+description+direction+default_type+allowed_type+vector+vector_bounds+null_allowed) + +parameter_table=''' +PARAMETER_TABLE: +Parameter_Name: rise_delay fall_delay +Description: "rise delay" "fall delay" +Data_Type: real real +Default_Value: 1.0e-9 1.0e-9 +Limits: [1e-12 -] [1e-12 -] +Vector: no no +Vector_Bounds: - - +Null_Allowed: yes yes + +PARAMETER_TABLE: +Parameter_Name: input_load stop_time +Description: "input load value (F)" "time at which to shut-down (seconds)" +Data_Type: real real +Default_Value: 1.0e-12 1.0 +Limits: - [0.0 -] +Vector: no no +Vector_Bounds: - - +Null_Allowed: yes no + +''' + + +#Writing all the content in ifspec file +ifspec.write(ifspec_comment) +ifspec.write(name_table+"\n\n") + +for item in in_port_table: + ifspec.write(item+"\n") + +ifspec.write("\n") + +for item in out_port_table: + ifspec.write(item+"\n") + +ifspec.write("\n") +ifspec.write(parameter_table) +ifspec.close() + + +########Creating testbench file ################################################ +print "Starting with testbench file" + +testbench=open(fname.split('.')[0]+'_tb.vhdl','w') +#Adding header, entity and architecture statement +tb_header=''' +library ieee; +use ieee.std_logic_1164.all; +use ieee.numeric_std.all; +library work; +use work.Vhpi_Foreign.all; +use work.Utility_Package.all; + + +''' + +tb_entity="entity "+fname.split('.')[0]+"_tb is\nend entity;\n\n" + +arch="architecture "+fname.split('.')[0]+"_tb_beh of "+fname.split('.')[0]+"_tb is\n" + +#Adding components + +components=[] +components.append("\tcomponent "+fname.split('.')[0]+" is\n\t\tport(\n\t\t\t\t") + +for item in input_port: + components.append(item.split(':')[0]+": in std_logic_vector("+str(int(item.split(':')[1])-int(1))+" downto 0);\n\t\t\t\t") + #if item.split(":")[1] != '1': + # components.append(item.split(':')[0]+": in std_logic_vector("+str(int(item.split(':')[1])-int(1))+" downto 0);\n\t\t\t\t") + #else: + # components.append(item.split(':')[0]+": in std_logic_vector("+str(int(item.split(':')[1])-int(1))+" downto 0);\n\t\t\t\t") + +for item in output_port: + components.append(item.split(':')[0]+": out std_logic_vector("+str(int(item.split(':')[1])-int(1))+" downto 0)\n\t\t\t\t") + #if item.split(":")[1] != '1': + # components.append(item.split(':')[0]+": out std_logic_vector("+str(int(item.split(':')[1])-int(1))+" downto 0)\n\t\t\t\t") + #else: + # components.append(item.split(':')[0]+": out std_logic_vector("+str(int(item.split(':')[1])-int(1))+" downto 0)\n\t\t\t\t") + +components.append(");\n") +components.append("\tend component;\n\n") + +#Adding signals +signals=[] +signals.append("\tsignal clk_s : std_logic := '0';\n") + +for item in input_port: + signals.append("\tsignal "+item.split(':')[0]+": std_logic_vector("+str(int(item.split(':')[1])-int(1))+" downto 0);\n") + #if item.split(":")[1] != '1': + # signals.append("\tsignal "+item.split(':')[0]+": std_logic_vector("+str(int(item.split(':')[1])-int(1))+" downto 0);\n") + #else: + # signals.append("\tsignal "+item.split(':')[0]+": std_logic_vector("+str(int(item.split(':')[1])-int(1))+" downto 0);\n") + + +for item in output_port: + signals.append("\tsignal "+item.split(':')[0]+": std_logic_vector("+str(int(item.split(':')[1])-int(1))+" downto 0);\n") + #if item.split(":")[1] != '1': + # signals.append("\tsignal "+item.split(':')[0]+": std_logic_vector("+str(int(item.split(':')[1])-int(1))+" downto 0);\n") + #else: + # signals.append("\tsignal "+item.split(':')[0]+": std_logic_vector("+str(int(item.split(':')[1])-int(1))+" downto 0);\n") + +#Adding mapping part +map=[] +map.append("\tu1 : "+fname.split('.')[0]+" port map(\n") + +for item in input_port: + map.append("\t\t\t\t"+item.split(':')[0]+" => "+item.split(':')[0]+",\n") + +for item in output_port: + if output_port.index(item) == len(output_port) - 1: + map.append("\t\t\t\t"+item.split(':')[0]+" => "+item.split(':')[0]+"\n") + else: + map.append("\t\t\t\t"+item.split(':')[0]+" => "+item.split(':')[0]+",\n") +map.append("\t\t\t);") + + +#testbench Clock +tb_clk= "clk_s <= not clk_s after 5 us;\n\n" + +#Adding process block +process=[] +process.append("\tprocess\n\n") + +for item in input_port: + process.append("\t\tvariable "+item.split(':')[0]+"_v : VhpiString;\n") + +for item in output_port: + process.append("\t\tvariable "+item.split(':')[0]+"_v : VhpiString;\n") + +process.append("\t\tvariable obj_ref : VhpiString;\n") +process.append("\tbegin\n\n\t\tVhpi_Initialize;\n\t\twait until clk_s = '1';\n\n") +process.append("\t\twhile true loop\n") +process.append("\t\t\twait until clk_s = '0';\n\t\t\twait for 5 ns;\n\t\t\tVhpi_Listen;\n\n") + +for item in input_port: + process.append('\t\t\tobj_ref := Pack_String_To_Vhpi_String("'+item.split(':')[0]+'");\n') + process.append('\t\t\tVhpi_Get_Port_Value(obj_ref,'+item.split(':')[0]+'_v,'+item.split(':')[1]+');\n') + process.append('\t\t\tassert false report "Get port value '+item.split(':')[0]+' returns " &'+item.split(':')[0]+'_v severity note;\n') + process.append('\t\t\t'+item.split(':')[0]+' <= Unpack_String('+item.split(':')[0]+'_v,'+item.split(':')[1]+');\n') + process.append('\t\t\twait for 1 ns;\n') + process.append("\n") + +for item in output_port: + process.append('\t\t\t'+item.split(':')[0]+'_v := Pack_String_To_Vhpi_String(Convert_SLV_To_String('+item.split(':')[0]+'));\n') + process.append('\t\t\tobj_ref := Pack_String_To_Vhpi_String("'+item.split(':')[0]+'");\n') + process.append('\t\t\tVhpi_Set_Port_Value(obj_ref,'+item.split(':')[0]+'_v,'+item.split(':')[1]+');\n') + process.append('\t\t\tassert false report "Set port value '+item.split(':')[0]+' returns " &'+item.split(':')[0]+'_v severity note;\n') + process.append('\t\t\twait for 1 ns;\n') + process.append("\n") + + +process.append("\t\t\tVhpi_Send;\n\n") +process.append("\t\tend loop;\n") +process.append("\tend process;\n\n") +process.append("end architecture;") + + +#Writing all the components to testbench file + +testbench.write(tb_header) +testbench.write(tb_entity) +testbench.write(arch) + +for item in components: + testbench.write(item) + +for item in signals: + testbench.write(item) + +testbench.write("\n\n") + +testbench.write("begin\n\n") + +for item in map: + testbench.write(item) + +testbench.write("\n\t"+tb_clk) + +for item in process: + testbench.write(item) + +testbench.close() + +#####################################Creating and writing components in start_server.sh ################################ + +start_server = open('start_server.sh','w') + +start_server.write("#!/bin/bash\n\n") +start_server.write("###This server run ghdl testebench for infinite time till ngspice send END signal to stop it\n\n") +start_server.write("#gcc -c ghdlserver.c\n") +start_server.write("#ghdl -a Utility_Package.vhdl &&\n") +start_server.write("#ghdl -a Vhpi_Package.vhdl &&\n") +start_server.write("cd "+home+"/ngspice-26/src/xspice/icm/ghdl/"+fname.split('.')[0]+"/DUTghdl/\n") +start_server.write("ghdl -a "+fname+" &&\n") +start_server.write("ghdl -a "+fname.split('.')[0]+"_tb.vhdl &&\n") +start_server.write("ghdl -e -Wl,ghdlserver.o "+fname.split('.')[0]+"_tb &&\n") +start_server.write("./"+fname.split('.')[0]+"_tb") + +start_server.close() |