Post process the output to make diff smaller. Signed-off-by: Tim 'mithro' Ansell <tansell@google.com>
diff --git a/open_pdks/gds_change_date.py b/open_pdks/gds_change_date.py new file mode 100755 index 0000000..4032736 --- /dev/null +++ b/open_pdks/gds_change_date.py
@@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +# Copyright 2021 SkyWater PDK Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +""" +Script to read a GDS file, modify the timestamp(s), and rewrite the GDS file. +""" + +import os +import sys +import datetime + +def usage(): + print('change_gds_date.py <create_stamp> <mod_stamp> <path_to_gds_in> [<path_to_gds_out>]') + +if __name__ == '__main__': + debug = False + + if len(sys.argv) == 1: + print("No options given to change_gds_date.py.") + usage() + sys.exit(0) + + optionlist = [] + arguments = [] + + for option in sys.argv[1:]: + if option.find('-', 0) == 0: + optionlist.append(option) + else: + arguments.append(option) + + if len(arguments) < 3 or len(arguments) > 4: + print("Wrong number of arguments given to change_gds_date.py.") + usage() + sys.exit(0) + + if '-debug' in optionlist: + debug = True + + createstamp = arguments[0] + modstamp = arguments[1] + source = arguments[2] + + # If modstamp is zero or negative, then set the modification timestamp + # to be the same as the creation timestamp. + try: + if int(modstamp) <= 0: + modstamp = createstamp + except: + pass + + # If only three arguments are provided, then overwrite the source file. + if len(arguments) == 4: + dest = arguments[3] + else: + dest = arguments[2] + + sourcedir = os.path.split(source)[0] + gdsinfile = os.path.split(source)[1] + + destdir = os.path.split(dest)[0] + gdsoutfile = os.path.split(dest)[1] + + with open(source, 'rb') as ifile: + gdsdata = ifile.read() + + # Generate 12-byte modification timestamp data from date. + try: + modtime = datetime.datetime.utcfromtimestamp(int(modstamp)) + except: + modtime = datetime.datetime.strptime(modstamp, "%m/%d/%Y %H:%M:%S") + + modyear = modtime.year - 1900 + + year = modyear.to_bytes(2, byteorder='big') + month = modtime.month.to_bytes(2, byteorder='big') + day = modtime.day.to_bytes(2, byteorder='big') + hour = modtime.hour.to_bytes(2, byteorder='big') + minute = modtime.minute.to_bytes(2, byteorder='big') + second = modtime.second.to_bytes(2, byteorder='big') + + gdsmodstamp = year + month + day + hour + minute + second + + # Generate 12-byte creation timestamp data from date. + try: + createtime = datetime.datetime.utcfromtimestamp(int(createstamp)) + except: + createtime = datetime.datetime.strptime(createstamp, "%m/%d/%Y %H:%M:%S") + + createyear = createtime.year - 1900 + + year = createyear.to_bytes(2, byteorder='big') + month = createtime.month.to_bytes(2, byteorder='big') + day = createtime.day.to_bytes(2, byteorder='big') + hour = createtime.hour.to_bytes(2, byteorder='big') + minute = createtime.minute.to_bytes(2, byteorder='big') + second = createtime.second.to_bytes(2, byteorder='big') + + gdscreatestamp = year + month + day + hour + minute + second + + # To be done: Allow the user to select which datestamps to change + # (library or structure). Otherwise, apply the same datestamps to both. + + recordtypes = ['beginstr', 'beginlib'] + recordfilter = [5, 1] + + datalen = len(gdsdata) + dataptr = 0 + while dataptr < datalen: + # Read stream records up to any string, then search for search text. + bheader = gdsdata[dataptr:dataptr + 2] + reclen = int.from_bytes(bheader, 'big') + if reclen == 0: + print('Error: found zero-length record at position ' + str(dataptr)) + break + + rectype = gdsdata[dataptr + 2] + datatype = gdsdata[dataptr + 3] + + brectype = rectype.to_bytes(1, byteorder='big') + bdatatype = datatype.to_bytes(1, byteorder='big') + + if rectype in recordfilter: + # Datatype should be 2 + if datatype != 2: + print('Error: Header data type is not 2-byte integer!') + if reclen != 28: + print('Error: Header record length is not 28!') + if debug: + print('Record type = ' + str(rectype) + ' data type = ' + str(datatype) + ' length = ' + str(reclen)) + + before = gdsdata[0:dataptr] + after = gdsdata[dataptr + reclen:] + + # Assemble the new record + newrecord = bheader + brectype + bdatatype + gdscreatestamp + gdsmodstamp + # Reassemble the GDS data around the new record + gdsdata = before + newrecord + after + + # Advance the pointer past the data + dataptr += reclen + + with open(dest, 'wb') as ofile: + ofile.write(gdsdata) + + exit(0)
diff --git a/open_pdks/post-open_pdks.sh b/open_pdks/post-open_pdks.sh new file mode 100755 index 0000000..0273fc6 --- /dev/null +++ b/open_pdks/post-open_pdks.sh
@@ -0,0 +1,28 @@ +#!/usr/bin/env bash +# Copyright 2021 SkyWater PDK Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +set -xe +set -o pipefail + +export PATH=/host/out/magic/bin:$PATH + +# Clear timestamps in magic files +find out/pdk-* -name '*.mag' -exec sed -i -e's/timestamp [0-9]\+/timestamp 0/' \{\} \+ + +# Clear timestamps in GDS files +find out/pdk-* -name '*.gds' -exec /host/git/builder/open_pdks/gds_change_date.py 1 0 \{\} +#find out/pdk-* -name '*.gds' -print | parallel -v /host/git/builder/open_pdks/gds_change_date.py 1 0 \{\}
diff --git a/open_pdks/run.sh b/open_pdks/run.sh index 51bf4f7..c87401f 100755 --- a/open_pdks/run.sh +++ b/open_pdks/run.sh
@@ -95,6 +95,7 @@ # Run `./configure` targeting the output directory. $DOCKER_CMD bash /host/$SCRIPT_DIR_REL/build-open_pdks.sh +$DOCKER_CMD bash /host/$SCRIPT_DIR_REL/post-open_pdks.sh # Tar up result. find out/pdk-* | sort | tee pdk.files