From 35e0ba6fc429448d859e3709439771a42d43e19b Mon Sep 17 00:00:00 2001 From: Jesse Cirimelli-Low Date: Thu, 11 Oct 2018 16:03:05 -0700 Subject: [PATCH] fixed merge error --- .../datasheet/characterization_corners.py | 17 +++ compiler/datasheet/datasheet.py | 55 ++++++++ compiler/datasheet/datasheet_gen.py | 123 ++++++++++++++++++ .../datasheets/sram_2_16_1_scn4m_subm.html | 51 ++++++++ compiler/datasheet/deliverables.py | 13 ++ compiler/datasheet/operating_conditions.py | 17 +++ compiler/datasheet/timing_and_current_data.py | 16 +++ 7 files changed, 292 insertions(+) create mode 100644 compiler/datasheet/characterization_corners.py create mode 100644 compiler/datasheet/datasheet.py create mode 100644 compiler/datasheet/datasheet_gen.py create mode 100644 compiler/datasheet/datasheets/sram_2_16_1_scn4m_subm.html create mode 100644 compiler/datasheet/deliverables.py create mode 100644 compiler/datasheet/operating_conditions.py create mode 100644 compiler/datasheet/timing_and_current_data.py diff --git a/compiler/datasheet/characterization_corners.py b/compiler/datasheet/characterization_corners.py new file mode 100644 index 00000000..54f75c3f --- /dev/null +++ b/compiler/datasheet/characterization_corners.py @@ -0,0 +1,17 @@ +from flask_table import * + +class characterization_corners(Table): + corner_name = Col('Corner Name') + process = Col('Process') + power_supply = Col('Power Supply') + temperature = Col('Temperature') + library_name_suffix = Col('Library Name Suffix') + +class characterization_corners_item(object): + def __init__(self, corner_name, process, power_supply, temperature, library_name_suffix): + self.corner_name = corner_name + self.process = process + self.power_supply = power_supply + self.temperature = temperature + self.library_name_suffix = library_name_suffix + diff --git a/compiler/datasheet/datasheet.py b/compiler/datasheet/datasheet.py new file mode 100644 index 00000000..396215a8 --- /dev/null +++ b/compiler/datasheet/datasheet.py @@ -0,0 +1,55 @@ +from flask_table import * +from operating_conditions import * +from characterization_corners import * +from deliverables import * +from timing_and_current_data import * + +class datasheet(): + + def __init__(self,identifier): + self.corners = [] + self.timing = [] + self.operating = [] + self.dlv = [] + self.name = identifier + self.html = "" + + def generate_html(self): + self.html = """""" + self.html +='

{0}

' + self.html +='

{0}

' + self.html +='

{0}

' + self.html +='

Operating Conditions

' + self.html += operating_conditions(self.operating,table_id='data').__html__() + self.html += '

Timing and Current Data

' + self.html += timing_and_current_data(self.timing,table_id='data').__html__() + self.html += '

Characterization Corners

' + self.html += characterization_corners(self.corners,table_id='data').__html__() + self.html +='

Deliverables

' + self.html += deliverables(self.dlv,table_id='data').__html__().replace('<','<').replace('"','"').replace('>',">") + + diff --git a/compiler/datasheet/datasheet_gen.py b/compiler/datasheet/datasheet_gen.py new file mode 100644 index 00000000..f15223bd --- /dev/null +++ b/compiler/datasheet/datasheet_gen.py @@ -0,0 +1,123 @@ +#!/usr/bin/env python3 +""" +Datasheet Generator + +TODO: +locate all port elements in .lib +Locate all timing elements in .lib +Diagram generation +Improve css +""" + +import os, math +import optparse +from flask_table import * +import csv +from globals import OPTS +from deliverables import * +from operating_conditions import * +from timing_and_current_data import * +from characterization_corners import * +from datasheet import * + +def process_name(corner): + if corner == "TT": + return "Typical - Typical" + if corner == "SS": + return "Slow - Slow" + if corner == "FF": + return "Fast - Fast" + else: + return "custom" + +def parse_file(f,pages): + with open(f) as csv_file: + csv_reader = csv.reader(csv_file, delimiter=',') + line_count = 0 + for row in csv_reader: + found = 0 + NAME = row[0] + NUM_WORDS = row[1] + NUM_BANKS = row[2] + NUM_RW_PORTS = row[3] + NUM_W_PORTS = row[4] + NUM_R_PORTS = row[5] + TECH_NAME = row[6] + TEMP = row[7] + VOLT = row[8] + PROC = row[9] + MIN_PERIOD = row[10] + OUT_DIR = row[11] + LIB_NAME = row[12] + for sheet in pages: + + + if sheet.name == row[0]: + found = 1 + #if the .lib information is for an existing datasheet compare timing data + + for item in sheet.operating: + + if item.parameter == 'Operating Temperature': + if float(TEMP) > float(item.max): + item.typ = item.max + item.max = TEMP + if float(TEMP) < float(item.min): + item.typ = item.min + item.min = TEMP + + if item.parameter == 'Power supply (VDD) range': + if float(VOLT) > float(item.max): + item.typ = item.max + item.max = VOLT + if float(VOLT) < float(item.min): + item.typ = item.min + item.min = VOLT + + if item.parameter == 'Operating Frequncy (F)': + if float(math.floor(1000/float(MIN_PERIOD)) < float(item.max)): + item.max = str(math.floor(1000/float(MIN_PERIOD))) + + + + new_sheet.corners.append(characterization_corners_item(PROC,process_name(PROC),VOLT,TEMP,LIB_NAME.replace(OUT_DIR,'').replace(NAME,''))) + new_sheet.dlv.append(deliverables_item('.lib','Synthesis models','{1}'.format(LIB_NAME,LIB_NAME.replace(OUT_DIR,'')))) + + if found == 0: + new_sheet = datasheet(NAME) + pages.append(new_sheet) + + new_sheet.corners.append(characterization_corners_item(PROC,process_name(PROC),VOLT,TEMP,LIB_NAME.replace(OUT_DIR,'').replace(NAME,''))) + + new_sheet.operating.append(operating_conditions_item('Power supply (VDD) range',VOLT,VOLT,VOLT,'Volts')) + new_sheet.operating.append(operating_conditions_item('Operating Temperature',TEMP,TEMP,TEMP,'Celsius')) + new_sheet.operating.append(operating_conditions_item('Operating Frequency (F)','','',str(math.floor(1000/float(MIN_PERIOD))),'MHz')) + + new_sheet.timing.append(timing_and_current_data_item('1','2','3','4')) + + new_sheet.dlv.append(deliverables_item('.sp','SPICE netlists','{1}.{2}'.format(OUT_DIR,NAME,'sp'))) + new_sheet.dlv.append(deliverables_item('.v','Verilog simulation models','{1}.{2}'.format(OUT_DIR,NAME,'v'))) + new_sheet.dlv.append(deliverables_item('.gds','GDSII layout views','{1}.{2}'.format(OUT_DIR,NAME,'gds'))) + new_sheet.dlv.append(deliverables_item('.lef','LEF files','{1}.{2}'.format(OUT_DIR,NAME,'lef'))) + new_sheet.dlv.append(deliverables_item('.lib','Synthesis models','{1}'.format(LIB_NAME,LIB_NAME.replace(OUT_DIR,'')))) + + + +class parse(): + def __init__(self,in_dir,out_dir): + + if not (os.path.isdir(in_dir)): + os.mkdir(in_dir) + + if not (os.path.isdir(out_dir)): + os.mkdir(out_dir) + + datasheets = [] + parse_file(in_dir + "/datasheet.info", datasheets) + + + for sheets in datasheets: +# print (out_dir + sheets.name + ".html") + with open(out_dir + "/" + sheets.name + ".html", 'w+') as f: + sheets.generate_html() + f.write(sheets.html) diff --git a/compiler/datasheet/datasheets/sram_2_16_1_scn4m_subm.html b/compiler/datasheet/datasheets/sram_2_16_1_scn4m_subm.html new file mode 100644 index 00000000..ebe538eb --- /dev/null +++ b/compiler/datasheet/datasheets/sram_2_16_1_scn4m_subm.html @@ -0,0 +1,51 @@ +

{0}

{0}

{0}

Operating Conditions

+ + + + + + +
ParameterMinTypMaxUnits
Power supply (VDD) range252525Volts
Operating Temperature5.05.05.0Celsius
Operating Frequency (F)213MHz

Timing and Current Data

+ + + + +
ParameterMinMaxUnits
1234

Characterization Corners

+ + + + +
Corner NameProcessPower SupplyTemperatureLibrary Name Suffix
TTTypical - Typical255.0_TT_5p0V_25C.lib

Deliverables

+ + + + + + + + +
TypeDescriptionLink
.spSPICE netlistssram_2_16_1_scn4m_subm.sp
.vVerilog simulation modelssram_2_16_1_scn4m_subm.v
.gdsGDSII layout viewssram_2_16_1_scn4m_subm.gds
.lefLEF filessram_2_16_1_scn4m_subm.lef
.libSynthesis modelssram_2_16_1_scn4m_subm_TT_5p0V_25C.lib
\ No newline at end of file diff --git a/compiler/datasheet/deliverables.py b/compiler/datasheet/deliverables.py new file mode 100644 index 00000000..d5287c3a --- /dev/null +++ b/compiler/datasheet/deliverables.py @@ -0,0 +1,13 @@ +from flask_table import * + +class deliverables(Table): + typ = Col('Type') + description = Col('Description') + link = Col('Link') + + +class deliverables_item(object): + def __init__(self, typ, description,link): + self.typ = typ + self.description = description + self.link = link diff --git a/compiler/datasheet/operating_conditions.py b/compiler/datasheet/operating_conditions.py new file mode 100644 index 00000000..e08adc61 --- /dev/null +++ b/compiler/datasheet/operating_conditions.py @@ -0,0 +1,17 @@ +from flask_table import * + +class operating_conditions(Table): + parameter = Col('Parameter') + min = Col('Min') + typ = Col('Typ') + max = Col('Max') + units = Col('Units') + +class operating_conditions_item(object): + def __init__(self, parameter, min, typ, max, units): + self.parameter = parameter + self.min = min + self.typ = typ + self.max = max + self.units = units + diff --git a/compiler/datasheet/timing_and_current_data.py b/compiler/datasheet/timing_and_current_data.py new file mode 100644 index 00000000..ebf489e8 --- /dev/null +++ b/compiler/datasheet/timing_and_current_data.py @@ -0,0 +1,16 @@ +from flask_table import * + +class timing_and_current_data(Table): + parameter = Col('Parameter') + min = Col('Min') + max = Col('Max') + units = Col('Units') + +class timing_and_current_data_item(object): + def __init__(self, parameter, min, max, units): + self.parameter = parameter + self.min = min + self.max = max + self.units = units + +