#!/usr/bin/python
########################################################################################################################
#
# Copyright (c) 2020, Nifty Chips Laboratory, Hanyang University
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the
# following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following
# disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the
# following disclaimer in the documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
########################################################################################################################
"""
This module implements interfaces with yaml files.
"""
__author__ = "Jaeduk Han"
__maintainer__ = "Jaeduk Han"
__status__ = "Prototype"
import yaml
import os.path
import laygo2
[docs]
def export_template(template, filename, mode='append'):
"""Export a template to a yaml file.
Parameters
----------
template: laygo2.object.template.Template
The template object to be exported.
filename: str
The name of the yaml file.
mode: str
If 'append', it adds the template entry without erasing the
preexisting file.
Example
-------
>>> import laygo2
>>> from laygo2.object.physical import Pin
>>> from laygo2.object.template import NativeInstanceTemplate
>>> p = dict()
>>> p['i'] = Pin(xy=[[0, 0], [10, 10]], layer=['M1', 'drawing'],
>>> netname='i')
>>> p['o'] = Pin(xy=[[90, 90], [100, 100]], layer=['M1', 'drawing'],
>>> netname='o')
>>> nt = NativeInstanceTemplate(libname='mylib', cellname='mytemp',
>>> bbox=[[0, 0], [100, 100]], pins=p)
>>> laygo2.interface.yaml.export_template(nt, filename="mytemplates.yaml")
Your design was translated into YAML format.
{'mylib': {
'mytemp': {
'libname': 'mylib',
'cellname': 'mytemp',
'bbox': [[0, 0], [100, 100]],
'pins': {
'i': {
'xy': [[0, 0], [10, 10]],
'layer': ['M1', 'drawing'],
'name': None,
'netname': 'i'
},
'o': {
'xy': [[90, 90], [100, 100]],
'layer': ['M1', 'drawing'],
'name': None,
'netname': 'o'
}}}}}
"""
libname = template.libname
cellname = template.cellname
pins = template.pins()
db = dict()
if mode == 'append': # in append mode, the template is appended to 'filename' if the file exists.
if os.path.exists(filename):
with open(filename, 'r') as stream:
db = yaml.load(stream, Loader=yaml.FullLoader)
else:
f_new = open(filename, "w")
f_new.write(f"{libname}:\n")
f_new.write(f" dummy:\n")
f_new.write(f" bbox:\n")
f_new.write(f" - - 0\n")
f_new.write(f" - 0\n")
f_new.write(f" - - 0\n")
f_new.write(f" - 0\n")
f_new.write(f" cellname: dummy\n")
f_new.write(f" libname: {libname}\n")
f_new.close()
with open(filename, 'r') as stream:
db = yaml.load(stream, Loader=yaml.FullLoader)
if libname not in db:
db[libname] = dict()
db[libname][cellname] = template.export_to_dict()
with open(filename, 'w') as stream:
yaml.dump(db, stream)
#print("Your design was translated into YAML format.")
return db
#filename=libname+'_templates.yaml'
[docs]
def import_template(filename):
"""Import templates from a yaml file.
Parameters
----------
filename: str
The name of the yaml file.
Example
-------
>>> import laygo2
>>> from laygo2.object.physical import Pin
>>> from laygo2.object.template import NativeInstanceTemplate
>>> p = dict()
>>> p['i'] = Pin(xy=[[0, 0], [10, 10]], layer=['M1', 'drawing'],
>>> netname='i')
>>> p['o'] = Pin(xy=[[90, 90], [100, 100]], layer=['M1', 'drawing'],
>>> netname='o')
>>> nt = NativeInstanceTemplate(libname='mylib', cellname='mytemp',
>>> bbox=[[0, 0], [100, 100]], pins=p)
>>> laygo2.interface.yaml.export_template(nt, filename="mytemplates.yaml")
>>> # Import the template back to python.
>>> my_tlib = laygo2.interface.yaml.import_template("mytemplates.yaml")
>>> print(my_tlib)
<laygo2.object.database.TemplateLibrary object at 0x000001FE3440A410>
name: mylib,
params: None
elements: {
'mytemp': <laygo2.object.template.NativeInstanceTemplate object at 0x000001FE3440A2C0>
}
"""
# load yaml file
if os.path.exists(filename):
with open(filename, 'r') as stream:
db = yaml.load(stream, Loader=yaml.FullLoader)
libname = list(db.keys())[0] # assuming there's only one library defined in each file.
# create template library
tlib = laygo2.object.database.TemplateLibrary(name=libname)
# read out the yaml file entries and build template objects
for tn, tdict in db[libname].items():
pins = dict()
if 'pins' in tdict:
for pinname, pdict in tdict['pins'].items():
pins[pinname] = laygo2.object.Pin(xy=pdict['xy'], layer=pdict['layer'], netname=pdict['netname'])
t = laygo2.object.NativeInstanceTemplate(libname=libname, cellname=tn, bbox=tdict['bbox'], pins=pins)
tlib.append(t)
return tlib