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

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [tools/] [cml2header.py] - Rev 2

Compare with Previous | Blame | View Log

#!/usr/bin/python
 
import os
import sys
import re
import StringIO
import getopt
 
class cml2header_translator:
	'''
	Translates a cml2 configuration file to a C header file
	that can be included in source code.
	'''
	def __init__(self):
		self.isnotset = re.compile("^# (.*) is not set")
 
	def linetrans(self, instream, outstream, trailer=None):
		'''
		Translates a stream line-by-line
		'''
		if not hasattr(instream, "readline"):
			instream = open(instream, "r")
		if not hasattr(outstream, "readline"):
			outstream = open(outstream, "w")
		while 1:
			line = instream.readline()
			if not line:
				break
			new = self.write_include(line)
			if new:
				outstream.write(new)
		instream.close()
		if trailer:
			outstream.write(trailer)
		outstream.close()
 
	def write_include(self, line):
		'''
		Translate a line of CML2 config file statement into
		C preprocessor #define format.
		'''
		if line.find("PRIVATE") > -1 or line[:2] == "$$":
			return ""
		match = self.isnotset.match(line)
		if match:
			return "#undef  %s\n" % match.group(1)
		if line == "#\n":
			return None
		elif line[0] == "#":
			return "/* " + line[1:].strip() + " */\n"
		eq = line.find("=")
		if eq == -1:
			return line
		else:
			line = line.split('#')[0]
			symbol = line[:eq]
			value = line[eq+1 :].strip()
		if value == 'y':
			return "#define %s 1\n" % symbol
		elif value == 'm':
			return "#undef %s\n#define %s_MODULE 1\n" % (symbol, symbol)
		elif value == 'n':
			return "#undef  %s\n" % symbol
		else:
			return "#define %s %s\n" % (symbol, value)
 
	def cml_configfile_exists(self, path):
		if not os.path.exists(path):
			print "CML2 configuration file not found."
			print "Given path:", path, "does not exist."
			return 0
		else:
			return 1
 
	def translate(self, configfile_path = None, headerfile_path = None):
 
		if configfile_path == None:
			configfile_path = os.getcwd() + '/' + "config.out"
 
		if headerfile_path == None:
			headerfile_path = os.getcwd() + '/' + "config.h"
		'''
		Takes a configuration file generated by the cml2 configurator,
		and converts it to a C header file. This header file is	then
		included by the kernel sources and the preprocessor definitions
		in it are used during the compilation of the kernel.
		'''
		if not self.cml_configfile_exists(configfile_path):
			print "Failed to translate cml configuration file", configfile_path, 'to', headerfile_path
			return -1
 
		self.linetrans(configfile_path, headerfile_path)
		return 0
 
	def usage(self):
		helpstr =	\
		'''\
    Description:
    cml2header.py takes a cml2 configuration file as input and generates
    a valid C header file to be included in C source code.
 
    Usage:
    cml2header.py -i inputfile -o outputfile [-h]
 
    Options:
	-i    The CML2 configuration file	(config.out by default)
	-o    The name of the header file	(config.h by default)
	-h    This help message
		'''
		print helpstr
 
def main():
	translator = cml2header_translator()
	try:
		opts, args = getopt.getopt(sys.argv[1:], "i:o:h:")
	except getopt.GetoptError:
		# print help information and exit:
		translator.usage()
		sys.exit(2)
 
	ofile = None
	ifile = None
 
	# Print help message if requested and quit
	if '-h' in opts:
		translator.usage()
		sys.exit()
 
	# Get the input and output filenames.
	for switch, val in opts:
        	if switch == '-i':
			ifile = val
		if switch == '-o':
			ofile = val
 
	# Translate
	if translator.translate(ifile, ofile) < 0:
		print "Translation of", ifile, 'to', ofile, 'failed.'
 
# Run the main routine only if this file is explicitly executed.
# (i.e. not referred from another module)
if __name__ == "__main__":
    main()
 
 

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.