diff options
author | Ambikeshwar | 2015-03-15 00:59:29 +0530 |
---|---|---|
committer | Ambikeshwar | 2015-03-15 00:59:29 +0530 |
commit | 85feda3887a9fe2b2fcbe3201013b2e4029399ee (patch) | |
tree | f13b0cfbc2a8ac2b01016e3fabf66c426cef4ccd /src/model_generation.py | |
parent | 088d7e5e83416bad141dfb56a7ae6f1bc01147bd (diff) | |
download | nghdl-85feda3887a9fe2b2fcbe3201013b2e4029399ee.tar.gz nghdl-85feda3887a9fe2b2fcbe3201013b2e4029399ee.tar.bz2 nghdl-85feda3887a9fe2b2fcbe3201013b2e4029399ee.zip |
changes removed
Diffstat (limited to 'src/model_generation.py')
-rwxr-xr-x | src/model_generation.py | 753 |
1 files changed, 0 insertions, 753 deletions
diff --git a/src/model_generation.py b/src/model_generation.py deleted file mode 100755 index f200743..0000000 --- a/src/model_generation.py +++ /dev/null @@ -1,753 +0,0 @@ -#!/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 for Vhpi -process_Vhpi=[] -process_Vhpi.append("\tprocess\n\n\t\tbegin\n\n\t\tVhpi_Initialize;\n\t\twait until clk_s = '1';\n\t\twhile true loop\n\t\t\twait until clk_s = '0';\n\t\t\tVhpi_Listen;\n\t\t\twait for 1 us;\n\t\t\tVhpi_Send;\n\t\tend loop;\n\t\twait;\n\tend process;\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") -process.append("\t\twhile true loop\n") -process.append("\t\t\twait until clk_s = '0';\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("\n") - -process.append('\t\t\twait for 1 us;\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("\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_Vhpi: - testbench.write(item) - -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() |