Пример #1
0
	def test_generate_define_table(self):
		"""generate a define table given a file"""
		import sappreproc
		import saputils
		filename = saputils.find_rtl_file_location("wb_ddr.v")
		print "filename: " + filename
		filestring = ""
		try:
			f = open(filename)
			print "opened file"
			filestring = f.read()
			f.close()
		except:
			print "Failed to open test filename"
			self.assertEqual(True, False)
			return

		result = sappreproc.generate_define_table(filestring, debug = self.dbg)


		self.assertEqual(len(result) > 0, True)
Пример #2
0
	def test_resolve_non_wsp_define(self):
		"""First test to see if the system will replace a define that isn't separated by whitespaces"""
		import sappreproc	
		import saputils
		#first get the filename
		filename = saputils.find_rtl_file_location("wb_ddr.v")
		filestring = ""
		try:
			f = open(filename)
			filestring = f.read()
			f.close()
		except:
			print "Failed to open test file"
			self.assertEqual(True, False)
			return

		define_dict = sappreproc.generate_define_table(filestring)
		#print "number of defines: " + str(len(define_dict.keys()))
		result = sappreproc.resolve_defines("`WB_ADR_WIDTH:0", define_dict, debug = self.dbg)

		self.assertEqual(len(result) > 0, True)
Пример #3
0
	def test_resolve_non_wsp_define(self):
		"""First test to see if the system will replace a define that isn't separated by whitespaces"""
		import sappreproc	
		import saputils
		#first get the filename
		filename = saputils.find_rtl_file_location("wb_ddr.v")
		filestring = ""
		try:
			f = open(filename)
			filestring = f.read()
			f.close()
		except:
			print "Failed to open test file"
			self.assertEqual(True, False)
			return

		define_dict = sappreproc.generate_define_table(filestring)
		#print "number of defines: " + str(len(define_dict.keys()))
		result = sappreproc.resolve_defines("`WB_ADR_WIDTH:0", define_dict, debug = self.dbg)

		self.assertEqual(len(result) > 0, True)
Пример #4
0
	def test_evaluate_range(self):
		"""test whether resolve string will get rid of parenthesis"""
		import sappreproc
		import saputils

		filename = saputils.find_rtl_file_location("wb_ddr.v")
		filestring = ""
		try:
			f = open(filename)
			filestring = f.read()
			f.close()
		except:
			print "Failed to open test file"
			self.assertEqual(True, False)
			return

		define_dict = sappreproc.generate_define_table(filestring)
		result = sappreproc.evaluate_range("val[(48 -12):0]", debug = self.dbg)
		
		print "final result: " + result
		self.assertEqual(result == "val[36:0]", True)
Пример #5
0
	def test_generate_define_table(self):
		"""generate a define table given a file"""
		import sappreproc
		import saputils
		filename = saputils.find_rtl_file_location("wb_ddr.v")
		#print "filename: " + filename
		filestring = ""
		try:
			f = open(filename)
#			print "opened file"
			filestring = f.read()
			f.close()
		except:
			print "Failed to open test filename"
			self.assertEqual(True, False)
			return

		result = sappreproc.generate_define_table(filestring, debug = self.dbg)


		self.assertEqual(len(result) > 0, True)
Пример #6
0
	def test_evaluate_range(self):
		"""test whether resolve string will get rid of parenthesis"""
		import sappreproc
		import saputils

		filename = saputils.find_rtl_file_location("wb_ddr.v")
		filestring = ""
		try:
			f = open(filename)
			filestring = f.read()
			f.close()
		except:
			print "Failed to open test file"
			self.assertEqual(True, False)
			return

		define_dict = sappreproc.generate_define_table(filestring)
		result = sappreproc.evaluate_range("val[(48 -12):0]", debug = self.dbg)
		
#		print "final result: " + result
		self.assertEqual(result == "val[36:0]", True)
Пример #7
0
	def test_resolve_multiple_defines(self):
		"""second easiest test, this one requires multiple passes of the 
		replacement string"""
		import sappreproc	
		import saputils
		#first get the filename
		filename = saputils.find_rtl_file_location("wb_ddr.v")
		filestring = ""
		try:
			f = open(filename)
			filestring = f.read()
			f.close()
		except:
			print "Failed to open test file"
			self.assertEqual(True, False)
			return

		define_dict = sappreproc.generate_define_table(filestring)
		#print "number of defines: " + str(len(define_dict.keys()))
		result = sappreproc.resolve_defines("`WB_ADR_WIDTH:`WB_SEL_WIDTH", define_dict, debug = self.dbg)

		self.assertEqual(len(result) > 0, True)
Пример #8
0
	def test_resolve_multiple_defines(self):
		"""second easiest test, this one requires multiple passes of the 
		replacement string"""
		import sappreproc	
		import saputils
		#first get the filename
		filename = saputils.find_rtl_file_location("wb_ddr.v")
		filestring = ""
		try:
			f = open(filename)
			filestring = f.read()
			f.close()
		except:
			print "Failed to open test file"
			self.assertEqual(True, False)
			return

		define_dict = sappreproc.generate_define_table(filestring)
		#print "number of defines: " + str(len(define_dict.keys()))
		result = sappreproc.resolve_defines("`WB_ADR_WIDTH:`WB_SEL_WIDTH", define_dict, debug = self.dbg)

		self.assertEqual(len(result) > 0, True)
Пример #9
0
def get_module_tags(filename="", bus="", keywords=[], debug=False):
    """Gets the tags for the module within the specified filename

  Given a module within a filename search through the module and 
  find:
    metadata
      \"DRT_ID\"
      \"DRT_FLAGS\"
    ports: Inputs/Outputs of this module
    module: Name of the module
    parameters: Configuration parameters within the module
    arbitrator_masters: Any arbitrator masters within the module

  Args:
    filename: Name of the module to interrogate
    bus: A string declaring the bus type, this can be
      \"wishbone\" or \"axie\"
    keywords:
      Besides the standard metadata any additional values to search for

  Returns:
    A dictionary of module tags

  Raises
    Nothing
  """
    tags = {}
    tags["keywords"] = {}
    tags["ports"] = {}
    tags["module"] = ""
    tags["parameters"] = {}
    tags["arbitrator_masters"] = []
    raw_buf = ""

    #need a more robust way of openning the slave

    #  keywords = [
    #    "DRT_ID",
    #    "DRT_FLAGS",
    #  ]

    ports = ["input", "output", "inout"]

    #XXX only working with verilog at this time, need to extend to VHDL
    with open(filename) as slave_file:
        buf = slave_file.read()
        raw_buf = buf

    #find all the metadata
    for key in keywords:
        index = buf.find(key)
        if (index == -1):
            if debug:
                print "didn't find substring for " + key
            continue
        if debug:
            print "found substring for " + key

        substring = buf.__getslice__(index, len(buf)).splitlines()[0]
        if debug:
            print "substring: " + substring

        if debug:
            print "found " + key + " substring: " + substring

        substring = substring.strip()
        substring = substring.strip("//")
        substring = substring.strip("/*")
        tags["keywords"][key] = substring.partition(":")[2]

    #remove all the comments from the code
    buf = remove_comments(buf)
    #print "no comments: \n\n" + buf

    for substring in buf.splitlines():
        if (len(substring.partition("module")[1]) == 0):
            continue
        module_string = substring.partition("module")[2]
        module_string = module_string.strip(" ")
        module_string = module_string.strip("(")
        index = module_string.find(" ")

        if (index != -1):
            tags["module"] = module_string.__getslice__(0, index)
        else:
            tags["module"] = module_string

        if debug:
            print "module name: " + module_string
            print tags["module"]

        break

    #find all the ports
    #find the index of all the processing block
    substrings = buf.splitlines()

    input_count = buf.count("input")
    output_count = buf.count("output")
    inout_count = buf.count("inout")

    if debug:
        print "filename: " + filename

    filestring = ""
    try:
        f = open(filename)
        filestring = f.read()
        f.close()


#XXX: This should probably allow the calling function to handle a failure
    except:
        print "Failed to open test filename"
        return

    ldebug = debug
    define_dict = sappreproc.generate_define_table(filestring, ldebug)

    #find all the IO's
    for io in ports:
        tags["ports"][io] = {}
        substrings = buf.splitlines()
        for substring in substrings:
            #      if debug:
            #        print "working on substring: " + substring
            substring = substring.strip()
            #if line doesn't start with an input/output or inout
            if (not substring.startswith(io)):
                continue
            #if the line does start with input/output or inout but is used in a name then bail
            if (not substring.partition(io)[2][0].isspace()):
                continue
            #one style will declare the port names after the ports list
            if (substring.endswith(";")):
                substring = substring.rstrip(";")
            #the other stile will include the entire port definition within the port declaration
            if (substring.endswith(",")):
                substring = substring.rstrip(",")
            if debug:
                print "substring: " + substring
            substring = substring.partition(io)[2]
            if (len(substring.partition("reg")[1]) != 0):
                substring = substring.partition("reg")[2]
            substring = substring.strip()
            max_val = -1
            min_val = -1
            if (len(substring.partition("]")[2]) != 0):
                #we have a range to work with?
                length_string = substring.partition("]")[0] + "]"
                substring = substring.partition("]")[2]
                substring = substring.strip()
                length_string = length_string.strip()
                if debug:
                    print "length string: " + length_string

                ldebug = debug

                length_string = sappreproc.resolve_defines(length_string,
                                                           define_dict,
                                                           debug=ldebug)
                length_string = sappreproc.evaluate_range(length_string)
                length_string = length_string.partition("]")[0]
                length_string = length_string.strip("[")
                if debug:
                    print "length string: " + length_string
                max_val = string.atoi(length_string.partition(":")[0])
                min_val = string.atoi(length_string.partition(":")[2])

            tags["ports"][io][substring] = {}

            if (max_val != -1):
                tags["ports"][io][substring]["max_val"] = max_val
                tags["ports"][io][substring]["min_val"] = min_val
                tags["ports"][io][substring]["size"] = (max_val + 1) - min_val
            else:
                tags["ports"][io][substring]["size"] = 1

            #print io + ": " + substring

    #find all the USER_PARAMETER declarations
    user_parameters = []
    substrings = raw_buf.splitlines()
    for substring in substrings:
        substring = substring.strip()
        if "USER_PARAMETER" in substring:
            name = substring.partition(":")[2].strip()
            user_parameters.append(name)

    #find all the parameters
    substrings = buf.splitlines()
    for substring in substrings:
        substring = substring.strip()
        if ("parameter" in substring):
            if debug:
                print "found parameter!"
            substring = substring.partition("parameter")[2].strip()
            parameter_name = substring.partition("=")[0].strip()
            parameter_value = substring.partition("=")[2].strip()
            parameter_value = parameter_value.partition(";")[0].strip()
            if debug:
                print "parameter name: " + parameter_name
                print "parameter value: " + parameter_value
            if parameter_name in user_parameters:
                tags["parameters"][parameter_name] = parameter_value

    tags["arbitrator_masters"] = saparbitrator.get_number_of_arbitrator_hosts(
        tags)

    if debug:
        print "input count: " + str(input_count)
        print "output count: " + str(output_count)
        print "inout count: " + str(inout_count)
        print "\n"

    if debug:
        print "module name: " + tags["module"]
        for key in tags["keywords"].keys():
            print "key: " + key + ":" + tags["keywords"][key]
        for io in ports:
            for item in tags["ports"][io].keys():
                print io + ": " + item
                for key in tags["ports"][io][item].keys():
                    value = tags["ports"][io][item][key]
                    if (isinstance(value, int)):
                        value = str(value)
                    print "\t" + key + ":" + value

    return tags
Пример #10
0
def get_module_tags(filename="", bus="", keywords=[], debug=False):
    """Gets the tags for the module within the specified filename

  Given a module within a filename search through the module and 
  find:
    metadata
      \"DRT_ID\"
      \"DRT_FLAGS\"
    ports: Inputs/Outputs of this module
    module: Name of the module
    parameters: Configuration parameters within the module
    arbitrator_masters: Any arbitrator masters within the module

  Args:
    filename: Name of the module to interrogate
    bus: A string declaring the bus type, this can be
      \"wishbone\" or \"axie\"
    keywords:
      Besides the standard metadata any additional values to search for

  Returns:
    A dictionary of module tags

  Raises
    Nothing
  """
    tags = {}
    tags["keywords"] = {}
    tags["ports"] = {}
    tags["module"] = ""
    tags["parameters"] = {}
    tags["arbitrator_masters"] = []
    raw_buf = ""

    # need a more robust way of openning the slave

    #  keywords = [
    #    "DRT_ID",
    #    "DRT_FLAGS",
    #  ]

    ports = ["input", "output", "inout"]

    # XXX only working with verilog at this time, need to extend to VHDL
    with open(filename) as slave_file:
        buf = slave_file.read()
        raw_buf = buf

    # find all the metadata
    for key in keywords:
        index = buf.find(key)
        if index == -1:
            if debug:
                print "didn't find substring for " + key
            continue
        if debug:
            print "found substring for " + key

        substring = buf.__getslice__(index, len(buf)).splitlines()[0]
        if debug:
            print "substring: " + substring

        if debug:
            print "found " + key + " substring: " + substring

        substring = substring.strip()
        substring = substring.strip("//")
        substring = substring.strip("/*")
        tags["keywords"][key] = substring.partition(":")[2]

    # remove all the comments from the code
    buf = remove_comments(buf)
    # print "no comments: \n\n" + buf

    for substring in buf.splitlines():
        if len(substring.partition("module")[1]) == 0:
            continue
        module_string = substring.partition("module")[2]
        module_string = module_string.strip(" ")
        module_string = module_string.strip("(")
        index = module_string.find(" ")

        if index != -1:
            tags["module"] = module_string.__getslice__(0, index)
        else:
            tags["module"] = module_string

        if debug:
            print "module name: " + module_string
            print tags["module"]

        break

    # find all the ports
    # find the index of all the processing block
    substrings = buf.splitlines()

    input_count = buf.count("input")
    output_count = buf.count("output")
    inout_count = buf.count("inout")

    if debug:
        print "filename: " + filename

    filestring = ""
    try:
        f = open(filename)
        filestring = f.read()
        f.close()
    # XXX: This should probably allow the calling function to handle a failure
    except:
        print "Failed to open test filename"
        return

    ldebug = debug
    define_dict = sappreproc.generate_define_table(filestring, ldebug)

    # find all the IO's
    for io in ports:
        tags["ports"][io] = {}
        substrings = buf.splitlines()
        for substring in substrings:
            #      if debug:
            #        print "working on substring: " + substring
            substring = substring.strip()
            # if line doesn't start with an input/output or inout
            if not substring.startswith(io):
                continue
            # if the line does start with input/output or inout but is used in a name then bail
            if not substring.partition(io)[2][0].isspace():
                continue
            # one style will declare the port names after the ports list
            if substring.endswith(";"):
                substring = substring.rstrip(";")
            # the other stile will include the entire port definition within the port declaration
            if substring.endswith(","):
                substring = substring.rstrip(",")
            if debug:
                print "substring: " + substring
            substring = substring.partition(io)[2]
            if len(substring.partition("reg")[1]) != 0:
                substring = substring.partition("reg")[2]
            substring = substring.strip()
            max_val = -1
            min_val = -1
            if len(substring.partition("]")[2]) != 0:
                # we have a range to work with?
                length_string = substring.partition("]")[0] + "]"
                substring = substring.partition("]")[2]
                substring = substring.strip()
                length_string = length_string.strip()
                if debug:
                    print "length string: " + length_string

                ldebug = debug

                length_string = sappreproc.resolve_defines(length_string, define_dict, debug=ldebug)
                length_string = sappreproc.evaluate_range(length_string)
                length_string = length_string.partition("]")[0]
                length_string = length_string.strip("[")
                if debug:
                    print "length string: " + length_string
                max_val = string.atoi(length_string.partition(":")[0])
                min_val = string.atoi(length_string.partition(":")[2])

            tags["ports"][io][substring] = {}

            if max_val != -1:
                tags["ports"][io][substring]["max_val"] = max_val
                tags["ports"][io][substring]["min_val"] = min_val
                tags["ports"][io][substring]["size"] = (max_val + 1) - min_val
            else:
                tags["ports"][io][substring]["size"] = 1

            # print io + ": " + substring

    # find all the USER_PARAMETER declarations
    user_parameters = []
    substrings = raw_buf.splitlines()
    for substring in substrings:
        substring = substring.strip()
        if "USER_PARAMETER" in substring:
            name = substring.partition(":")[2].strip()
            user_parameters.append(name)

    # find all the parameters
    substrings = buf.splitlines()
    for substring in substrings:
        substring = substring.strip()
        if "parameter" in substring:
            if debug:
                print "found parameter!"
            substring = substring.partition("parameter")[2].strip()
            parameter_name = substring.partition("=")[0].strip()
            parameter_value = substring.partition("=")[2].strip()
            parameter_value = parameter_value.partition(";")[0].strip()
            if debug:
                print "parameter name: " + parameter_name
                print "parameter value: " + parameter_value
            if parameter_name in user_parameters:
                tags["parameters"][parameter_name] = parameter_value

    tags["arbitrator_masters"] = saparbitrator.get_number_of_arbitrator_hosts(tags)

    if debug:
        print "input count: " + str(input_count)
        print "output count: " + str(output_count)
        print "inout count: " + str(inout_count)
        print "\n"

    if debug:
        print "module name: " + tags["module"]
        for key in tags["keywords"].keys():
            print "key: " + key + ":" + tags["keywords"][key]
        for io in ports:
            for item in tags["ports"][io].keys():
                print io + ": " + item
                for key in tags["ports"][io][item].keys():
                    value = tags["ports"][io][item][key]
                    if isinstance(value, int):
                        value = str(value)
                    print "\t" + key + ":" + value

    return tags
Пример #11
0
def get_module_tags(filename="", bus="", keywords = [], debug=False):
	tags = {}
	tags["keywords"] = {}
	tags["ports"] = {}
	tags["module"] = ""
	tags["parameters"] = {}
		
	#need a more robust way of openning the slave

#	keywords = [
#		"DRT_ID",
#		"DRT_FLAGS",
#	]

	ports = [
		"input",
		"output",
		"inout"
	]

	#XXX only working with verilog at this time, need to extend to VHDL
	with open(filename) as slave_file:
		buf = slave_file.read()
	
	#find all the metadata
	for key in keywords:
		index = buf.find (key)
		if (index == -1):
			if debug:
				print "didn't find substring for " + key
			continue
		if debug:
			print "found substring for " + key

		substring = buf.__getslice__(index, len(buf)).splitlines()[0]
		if debug:
			print "substring: " + substring

		
		if debug:
			print "found " + key + " substring: " + substring

		substring = substring.strip()
		substring = substring.strip("//")
		substring = substring.strip("/*")
		tags["keywords"][key] = substring.partition(":")[2] 
			
				

	#remove all the comments from the code
	buf = remove_comments(buf)
	#print "no comments: \n\n" + buf

	for substring in buf.splitlines():
		if (len(substring.partition("module")[1]) == 0):
			continue
		module_string = substring.partition("module")[2]
		module_string = module_string.strip(" ")
		index = module_string.find(" ")

		if (index != -1):
			tags["module"] = module_string.__getslice__(0, index)
		else:
			tags["module"] = module_string

		if debug:
			print "module name: " + module_string
			print tags["module"]

		break
	
	#find all the ports
	#find the index of all the processing block
	substrings = buf.splitlines()

	input_count = buf.count("input")
	output_count = buf.count("output")
	inout_count = buf.count("inout")

	if debug:
		print "filename: " + filename
	
	filestring = ""
	try:
		f = open(filename)
		filestring = f.read()
		f.close()
	except:
		print "Failed to open test filename"
		return

	ldebug = debug
	define_dict = sappreproc.generate_define_table(filestring, ldebug)	

	#find all the IO's
	for io in ports:
		tags["ports"][io] = {}
		substrings = buf.splitlines()	
		for substring in substrings:
			if debug:
				print "working on substring: " + substring
			substring = substring.strip()
			#if line doesn't start with an input/output or inout
			if (not substring.startswith(io)):
				continue
			#if the line does start with input/output or inout but is used in a name then bail
			if (not substring.partition(io)[2][0].isspace()):
				continue
			#one style will declare the port names after the ports list
			if (substring.endswith(";")):
				substring = substring.rstrip(";")
			#the other stile will include the entire port definition within the port declaration
			if (substring.endswith(",")):
				substring = substring.rstrip(",")
			if debug:
				print "substring: " + substring
			substring = substring.partition(io)[2]
			if (len(substring.partition("reg")[1]) != 0):
				substring = substring.partition("reg")[2]
			substring = substring.strip()
			max_val = -1
			min_val = -1
			if (len(substring.partition("]")[2]) != 0):
				#we have a range to work with?
				length_string = substring.partition("]")[0] + "]"
				substring = substring.partition("]")[2] 
				substring = substring.strip()
				length_string = length_string.strip()
				if debug:
					print "length string: " + length_string

				ldebug = debug

				length_string = sappreproc.resolve_defines(length_string, define_dict, debug=ldebug)
				length_string = sappreproc.evaluate_range(length_string)
				length_string = length_string.partition("]")[0]
				length_string = length_string.strip("[")
				if debug:
					print "length string: " + length_string
				max_val = string.atoi(length_string.partition(":")[0])
				min_val = string.atoi(length_string.partition(":")[2])

			tags["ports"][io][substring] = {}

			if (max_val != -1):
				tags["ports"][io][substring]["max_val"] = max_val
				tags["ports"][io][substring]["min_val"] = min_val
				tags["ports"][io][substring]["size"] = (max_val + 1) - min_val
			else:
				tags["ports"][io][substring]["size"] = 1
			
			#print io + ": " + substring

	#find all the parameters
	substrings = buf.splitlines()
	for substring in substrings:
		substring = substring.strip()	
		if ("parameter" in substring):
			if debug:
				print "found parameter!"
			substring = substring.partition("parameter")[2].strip()
			parameter_name = substring.partition("=")[0].strip()
			parameter_value = substring.partition("=")[2].strip()
			parameter_value = parameter_value.partition(";")[0].strip()
			if debug:
				print "parameter name: " + parameter_name
				print "parameter value: " + parameter_value
			tags["parameters"][parameter_name] = parameter_value




	if debug:
		print "input count: " + str(input_count)
		print "output count: " + str(output_count)
		print "inout count: " + str(inout_count)
		print "\n"
			
	if debug:
		print "module name: " + tags["module"]
		for key in tags["keywords"].keys():
			print "key: " + key + ":" + tags["keywords"][key]
		for io in ports:
			for item in tags["ports"][io].keys():
				print io + ": " + item
				for key in tags["ports"][io][item].keys():
					value = tags["ports"][io][item][key]
					if (isinstance( value, int)):
						value = str(value)
					print "\t" + key + ":" + value
	return tags