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

Subversion Repositories lxp32

[/] [lxp32/] [trunk/] [tools/] [src/] [wigen/] [main.cpp] - Rev 9

Compare with Previous | Blame | View Log

/*
 * Copyright (c) 2016 by Alex I. Kuznetsov.
 *
 * Part of the LXP32 CPU IP core.
 *
 * Main translation unit for the WISHBONE interconnect generator.
 */
 
#include "generator.h"
 
#include <iostream>
#include <string>
#include <stdexcept>
#include <cstring>
#include <cstdlib>
 
static void displayUsage(std::ostream &os,const char *program) {
	os<<std::endl;
	os<<"Usage:"<<std::endl;
	os<<"    "<<program<<" [ option(s) ] <nm> <ns> <ma> <sa> <ps> [ <pg> ]"<<std::endl<<std::endl;
	os<<"    <nm>         Number of masters"<<std::endl;
	os<<"    <ns>         Number of slaves"<<std::endl;
	os<<"    <ma>         Master address width"<<std::endl;
	os<<"    <sa>         Slave address width"<<std::endl;
	os<<"    <ps>         Port size"<<std::endl;
	os<<"    <pg>         Port granularity, default: port size"<<std::endl;
	os<<std::endl;
 
	os<<"Options:"<<std::endl;
	os<<"    -e <entity>  Entity name, default: \"intercon\""<<std::endl;
	os<<"    -h, --help   Display a short help message"<<std::endl;
	os<<"    -o <file>    Output file name, default: \"<entity>.vhd\""<<std::endl;
	os<<"    -p           Generate pipelined arbiter"<<std::endl;
	os<<"    -r           Generate registered feedback signals"<<std::endl;
	os<<"    -u           Generate unsafe slave decoder"<<std::endl;
}
 
int main(int argc,char *argv[]) try {
	std::cout<<"WISHBONE interconnect generator"<<std::endl;
	std::cout<<"Copyright (c) 2016 by Alex I. Kuznetsov"<<std::endl;
 
	if(argc<=1) {
		displayUsage(std::cout,argv[0]);
		return 0;
	}
 
	Generator gen;
	std::string outputFileName;
	int mainArg=0;
 
	for(int i=1;i<argc;i++) {
		if(argv[i][0]=='-') {
			if(!strcmp(argv[i],"-e")) {
				if(++i==argc) {
					displayUsage(std::cerr,argv[0]);
					return EXIT_FAILURE;
				}
				gen.setEntityName(argv[i]);
			}
			else if(!strcmp(argv[i],"-h")||!strcmp(argv[i],"--help")) {
				displayUsage(std::cout,argv[0]);
				return 0;
			}
			else if(!strcmp(argv[i],"-o")) {
				if(++i==argc) {
					displayUsage(std::cerr,argv[0]);
					return EXIT_FAILURE;
				}
				outputFileName=argv[i];
			}
			else if(!strcmp(argv[i],"-p")) {
				gen.setPipelinedArbiter(true);
			}
			else if(!strcmp(argv[i],"-r")) {
				gen.setRegisteredFeedback(true);
			}
			else if(!strcmp(argv[i],"-u")) {
				gen.setUnsafeDecoder(true);
			}
			else throw std::runtime_error(std::string("Unrecognized option: \"")+argv[i]+"\"");
		}
		else {
			if(mainArg>5) throw std::runtime_error("Too many arguments");
 
			int value;
 
			try {
				value=std::stoi(argv[i],nullptr,0);
			}
			catch(std::exception &) {
				throw std::runtime_error("Invalid value");
			}
 
			switch(mainArg) {
			case 0:
				gen.setMasters(value);
				break;
			case 1:
				gen.setSlaves(value);
				break;
			case 2:
				gen.setAddrWidth(value);
				break;
			case 3:
				gen.setSlaveAddrWidth(value);
				break;
			case 4:
				gen.setPortSize(value);
				break;
			case 5:
				gen.setPortGranularity(value);
				break;
			}
			mainArg++;
		}
	}
 
	if(mainArg<5) throw std::runtime_error("Too few arguments");
	if(mainArg==5) gen.setPortGranularity(gen.portSize());
 
	if(outputFileName.empty()) outputFileName=gen.entityName()+".vhd";
 
	gen.generate(outputFileName);
}
catch(std::exception &ex) {
	std::cerr<<"Error: "<<ex.what()<<std::endl;
	return EXIT_FAILURE;
}
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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