OpenCores
URL https://opencores.org/ocsvn/hwlu/hwlu/trunk

Subversion Repositories hwlu

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /hwlu/trunk/sw
    from Rev 11 to Rev 12
    Reverse comparison

Rev 11 → Rev 12

/gen_hw_looping.c
0,0 → 1,325
/********************************************************************/
/* Filename : gen_hw_looping.c */
/* Description: Generates top-level module for the hw_looping unit. */
/* Author : Nikolaos Kavvadias, <nkavv@physics.auth.gr> */
/* Date : Friday, 09/04/2004 */
/* Revision : 09/02/2010: Created common.[c|h]. */
/********************************************************************/
 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "common.h"
 
#define PRINT_DEBUG
 
// FUNCTION PROTOTYPES
void write_file_hw_looping(FILE *outfile);
 
FILE *file_hw_looping; /* VHDL source for the top-level module of the
* hw_looping unit (hw_looping.vhd) */
 
char hw_looping_file_name[32];
int enable_nlp=0, enable_nodistrib=0;
int nlp=1;
time_t t;
 
 
int main(int argc, char **argv)
{
int i;
int gen_hw_looping_file;
char nlp_s[3];
gen_hw_looping_file = 0;
// Read input arguments
if (argc < 3)
{
printf("Usage: gen_hw_looping -nlp <num loops> [-nodistrib] <output base>\n");
printf("where:\n");
printf("-nlp <num> = give number of supported loops (default = 1).\n");
printf("-nodistrib = use vectors for data input ports.\n");
printf("<output base> = output file base name. The generated files will be named:\n");
printf(" \"<output base>_top.vhd\" for the top-level module.\n");
printf("\n");
exit(1);
}
 
for (i = 1; i < argc; i++)
{
if (strcmp("-nodistrib",argv[i]) == 0)
{
enable_nodistrib = 1;
}
else if (strcmp("-nlp",argv[i]) == 0)
{
enable_nlp = 1;
if ((i+1) < argc)
{
i++;
nlp = atoi(argv[i]);
}
}
else //if (strcmp("-o",argv[i]) == 0)
{
if (i < argc)
{
sprintf(hw_looping_file_name,"%s_loops%d%s", argv[i], nlp, "_top.vhd");
gen_hw_looping_file = 1;
}
}
}
 
// DEBUG OUTPUT
#ifdef PRINT_DEBUG
printf("\n");
//
printf("nlp = %d\n",nlp);
printf("hw_looping_file_name = %s\n", hw_looping_file_name);
//
#endif
/*************************************************************/
/* Generate VHDL source for the top-level unit of hw_looping */
/*************************************************************/
if (gen_hw_looping_file == 1)
{
file_hw_looping = fopen(hw_looping_file_name,"w");
write_file_hw_looping(file_hw_looping);
fclose(file_hw_looping);
}
 
return 0;
}
void write_file_hw_looping(FILE *outfile)
{
unsigned int i;
// Get current time
time(&t);
 
/* Generate interface for the VHDL file */
fprintf(outfile,"----==============================================================----\n");
fprintf(outfile,"---- ----\n");
fprintf(outfile,"---- Filename: %s ----\n", hw_looping_file_name);
fprintf(outfile,"---- Module description: Top-level file for the hw_looping unit. ----\n");
fprintf(outfile,"---- Also implements input and output ----\n");
fprintf(outfile,"---- wrapping operations. ----\n");
fprintf(outfile,"---- ----\n");
fprintf(outfile,"---- Author: Nikolaos Kavvadias ----\n");
fprintf(outfile,"---- nkavv@physics.auth.gr ----\n");
fprintf(outfile,"---- ----\n");
fprintf(outfile,"---- ----\n");
fprintf(outfile,"---- Part of the hwlu OPENCORES project generated automatically ----\n");
fprintf(outfile,"---- with the use of the \"gen_hw_looping\" tool ----\n");
fprintf(outfile,"---- ----\n");
fprintf(outfile,"---- To Do: ----\n");
fprintf(outfile,"---- Considered stable for the time being ----\n");
print_vhdl_header_common(outfile);
 
/* Code generation for library inclusions */
fprintf(outfile,"library IEEE;\n");
fprintf(outfile,"use IEEE.std_logic_1164.all;\n");
fprintf(outfile,"\n");
 
/* Generate entity declaration */
fprintf(outfile,"entity hw_looping is\n");
fprintf(outfile,"\tgeneric (\n");
fprintf(outfile,"\t\tNLP : integer := %d;\n", nlp);
fprintf(outfile,"\t\tDW : integer := 8\n");
fprintf(outfile,"\t);\n");
fprintf(outfile,"\tport (\n");
fprintf(outfile, "\t\tclk : in std_logic;\n");
fprintf(outfile, "\t\treset : in std_logic;\n");
fprintf(outfile, "\t\ttask_loop%d_end : in std_logic;\n", nlp);
//
if (enable_nodistrib == 1)
{
fprintf(outfile,"\t\tloop_count : in std_logic_vector(NLP*DW-1 downto 0);\n");
fprintf(outfile,"\t\tindex : out std_logic_vector(NLP*DW-1 downto 0);\n");
}
else
{
for (i=1; i<=nlp; i++)
{
fprintf(outfile,"\t\tloop%d_count : in std_logic_vector(DW-1 downto 0);\n", i);
}
for (i=1; i<=nlp; i++)
{
fprintf(outfile,"\t\tindex%d : out std_logic_vector(DW-1 downto 0);\n", i);
}
}
//
fprintf(outfile, "\t\tloops_end : out std_logic\n");
//
fprintf(outfile,"\t);\n");
fprintf(outfile,"end hw_looping;\n");
fprintf(outfile,"\n");
 
/* Generate architecture declaration */
fprintf(outfile,"architecture structural of hw_looping is\n");
/* Add component declarations here if needed */
fprintf(outfile,"--\n");
fprintf(outfile,"-- Component declarations\n");
fprintf(outfile,"component cmpeq\n");
fprintf(outfile,"\tgeneric (\n");
fprintf(outfile,"\t\tDW : integer := 8\n");
fprintf(outfile,"\t);\n");
fprintf(outfile,"\tport (\n");
fprintf(outfile,"\t\ta : in std_logic_vector(DW-1 downto 0);\n");
fprintf(outfile,"\t\tb : in std_logic_vector(DW-1 downto 0);\n");
fprintf(outfile,"\t\treset : in std_logic;\n");
fprintf(outfile,"\t\ta_eq_b : out std_logic\n");
fprintf(outfile,"\t);\n");
fprintf(outfile,"end component;\n");
//
fprintf(outfile,"--\n");
fprintf(outfile,"component index_inc\n");
fprintf(outfile,"\tgeneric (\n");
fprintf(outfile,"\t\tDW : integer := 8\n");
fprintf(outfile,"\t);\n");
fprintf(outfile,"\tport (\n");
fprintf(outfile,"\t\tclk : in std_logic;\n");
fprintf(outfile,"\t\treset : in std_logic;\n");
fprintf(outfile,"\t\tinc_en : in std_logic;\n");
fprintf(outfile,"\t\tindex_plus_one : out std_logic_vector(DW-1 downto 0);\n");
fprintf(outfile,"\t\tindex_out : out std_logic_vector(DW-1 downto 0)\n");
fprintf(outfile,"\t);\n");
fprintf(outfile,"end component;\n");
//
fprintf(outfile,"--\n");
fprintf(outfile,"component priority_encoder\n");
fprintf(outfile,"\tgeneric (\n");
fprintf(outfile,"\t\tNLP : integer := 5\n");
fprintf(outfile,"\t);\n");
fprintf(outfile,"\tport (\n");
fprintf(outfile,"\t\tflag : in std_logic_vector(NLP-1 downto 0);\n");
fprintf(outfile,"\t\ttask_loop%d_end : in std_logic;\n", nlp);
fprintf(outfile,"\t\tincl : out std_logic_vector(NLP-1 downto 0);\n");
fprintf(outfile,"\t\treset_vct : out std_logic_vector(NLP-1 downto 0);\n");
fprintf(outfile,"\t\tloops_end : out std_logic\n");
fprintf(outfile,"\t);\n");
fprintf(outfile,"end component;\n");
/* Add signal declarations here if needed */
fprintf(outfile,"--\n");
fprintf(outfile,"-- Signal declarations\n");
// flag
fprintf(outfile,"signal flag : std_logic_vector(NLP-1 downto 0);\n");
// incl
fprintf(outfile,"signal incl : std_logic_vector(NLP-1 downto 0);\n");
// temp_loop_count
fprintf(outfile,"signal temp_loop_count : std_logic_vector(NLP*DW-1 downto 0);\n");
// temp_index
fprintf(outfile,"signal temp_index : std_logic_vector(NLP*DW-1 downto 0);\n");
// temp_index_plus_one
fprintf(outfile,"signal temp_index_plus_one : std_logic_vector(NLP*DW-1 downto 0);\n");
// temp_vct_penc
fprintf(outfile,"signal reset_vct_penc : std_logic_vector(NLP-1 downto 0);\n");
// temp_index
fprintf(outfile,"signal reset_vct_ix : std_logic_vector(NLP-1 downto 0);\n");
fprintf(outfile,"--\n");
/* Continue with the rest of the architecture declaration */
fprintf(outfile,"begin\n");
fprintf(outfile,"\n");
/***************************************/
/* GENERATE INPUT WRAPPING ASSIGNMENTS */
/***************************************/
 
if (enable_nodistrib == 1)
{
fprintf(outfile,"\ttemp_loop_count <= loop_count;\n");
}
else
{
/* Iterate through all loops */
for (i=1; i<=nlp; i++)
{
/* Generate assignment code */
fprintf(outfile,"\ttemp_loop_count( ((NLP-%d)*DW-1) downto ((NLP-%d)*DW) ) <= loop%d_count;\n",
i-1, i, i);
}
}
fprintf(outfile,"\n");
/***************************************/
/* GENERATE INTERNAL HW_LOOPING MODULE */
/***************************************/
// Generate cmpeq modules
fprintf(outfile,"\tGEN_COMPARATORS: for i in 0 to NLP-1 generate\n");
fprintf(outfile,"\t\tU_cmp : cmpeq\n");
fprintf(outfile,"\t\t\tgeneric map (\n");
fprintf(outfile,"\t\t\t\tDW => DW\n");
fprintf(outfile,"\t\t\t)\n");
fprintf(outfile,"\t\t\tport map (\n");
fprintf(outfile,"\t\t\t\ta => temp_index_plus_one( ((i+1)*DW-1) downto (i*DW) ),\n");
fprintf(outfile,"\t\t\t\tb => temp_loop_count( ((i+1)*DW-1) downto (i*DW) ),\n");
fprintf(outfile,"\t\t\t\treset => reset,\n");
fprintf(outfile,"\t\t\t\ta_eq_b => flag(i)\n");
fprintf(outfile,"\t\t\t);\n");
fprintf(outfile,"\tend generate GEN_COMPARATORS;\n");
fprintf(outfile,"\n");
// Generate priority encoder
fprintf(outfile,"\tU_priority_enc : priority_encoder\n");
fprintf(outfile,"\t\tgeneric map (\n");
fprintf(outfile,"\t\t\tNLP => NLP\n");
fprintf(outfile,"\t\t)\n");
fprintf(outfile,"\t\tport map (\n");
fprintf(outfile,"\t\t\tflag => flag,\n");
fprintf(outfile,"\t\t\ttask_loop%d_end => task_loop%d_end,\n", nlp, nlp);
fprintf(outfile,"\t\t\tincl => incl,\n");
fprintf(outfile,"\t\t\treset_vct => reset_vct_penc,\n");
fprintf(outfile,"\t\t\tloops_end => loops_end\n");
fprintf(outfile,"\t\t);\n");
fprintf(outfile,"\n");
// Generate reset_vct_ix
fprintf(outfile,"\tGEN_RESET_SEL: for i in 0 to NLP-1 generate\n");
fprintf(outfile,"\t\treset_vct_ix(i) <= reset_vct_penc(i) or reset;\n");
fprintf(outfile,"\tend generate GEN_RESET_SEL;\n");
fprintf(outfile,"\n");
// Generate index_inc modules
fprintf(outfile,"\tGEN_INC_IX: for i in 0 to NLP-1 generate\n");
fprintf(outfile,"\t\tU_inc_ix1 : index_inc\n");
fprintf(outfile,"\t\t\tgeneric map (\n");
fprintf(outfile,"\t\t\t\tDW => DW\n");
fprintf(outfile,"\t\t\t)\n");
fprintf(outfile,"\t\t\tport map (\n");
fprintf(outfile,"\t\t\t\tclk => clk,\n");
fprintf(outfile,"\t\t\t\treset => reset_vct_ix(i),\n");
fprintf(outfile,"\t\t\t\tinc_en => incl(i),\n");
fprintf(outfile,"\t\t\t\tindex_plus_one => temp_index_plus_one( ((i+1)*DW-1) downto (i*DW) ),\n");
fprintf(outfile,"\t\t\t\tindex_out => temp_index( ((i+1)*DW-1) downto (i*DW) )\n");
fprintf(outfile,"\t\t\t);\n");
fprintf(outfile,"\tend generate GEN_INC_IX;\n");
fprintf(outfile,"\n");
/****************************************/
/* GENERATE OUTPUT WRAPPING ASSIGNMENTS */
/****************************************/
if (enable_nodistrib == 1)
{
fprintf(outfile,"\ttemp_loop_count <= loop_count;\n");
}
else
{
/* Iterate through all loops */
for (i=1; i<=nlp; i++)
{
/* Generate assignment code */
fprintf(outfile,"\tindex%d <= temp_index( ((NLP-%d)*DW-1) downto ((NLP-%d)*DW) );\n", i, i-1, i);
}
}
fprintf(outfile,"\n");
fprintf(outfile,"end structural;\n");
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.