#!/usr/bin/env python3
# Copyright 2020 The 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
#
#     https://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.


import os
import common

spice = [
    '.all',
    '.cor',
    '.hed',
    '.mod',
    '.pm3',
    '.scs',
    '.sp',
    '.spi',
    '.spice',
    '.txt',
]
txt_ignore = [
    'README.txt',
]

o = open('.files.spice', 'w')
for pname in common.files(spice):
    pname = pname.strip()
    fname = os.path.split(pname)[-1]
    _, ext = os.path.splitext(pname)
    if ext not in spice:
        continue

    contents = open(pname).read()

    found = []
    if not contents.strip():
        found.append('empty')

    # Forms of subckt
    # ------------------------
    # Normal `.subckt` form
    if '.subckt' in contents:
        found.append('.subckt')
    elif '.SUBCKT' in contents:
        found.append('.SUBCKT')
    # `inline subckt` form found in SPECTRE/*/*.pm3 files
    elif 'inline subckt' in contents:
        assert ext in (".pm3", '.mod'), pname
        found.append('inline subckt')
    # Bare `subckt` form found in XXX/spectre/spice.sp files
    elif 'subckt ' in contents:
        assert fname == "spice.sp", pname
        found.append('bare subckt')

    # Special file indicators
    # ------------------------
    if "SPICE3 file" in contents:
        assert ext == ".spice", pname
        found.append('SPICE3')
    if "SPICE3 file" in contents:
        assert ext == ".spice", pname
        found.append('SPICE3')
    if "NGSPICE file" in contents:
        assert ext.startswith(".sp"), pname
        found.append('NGSPICE')

    # Includes
    # ------------------------
    if ".inc " in contents:
        found.append(".inc(lude)")
    if ".include " in contents:
        found.append(".include")
    elif "include " in contents:
        found.append("(.)include")

    # Other . objects
    # ------------------------
    if ".param" in contents:
        found.append('.param')
    if '.model' in contents:
        found.append('.model')

    if "simulator lang=spectre" in contents:
        found.append('lang=spectre')
    if "simulator lang=spice" in contents:
        found.append('lang=spectre')

    if "* model.hed" in contents:
        found.append("hed")
    if "save " in contents:
        found.append("save")

    if not found:
        if fname == 'icm_pmlog.txt':
            continue
        if 'Calibre' in pname:
            assert ext == '.mod', pname
            continue
        print("--", pname, 'not spice model?')
    else:
        print(pname, found)
    o.write(pname)
    o.write('\n')
o.close()
