#!/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 json
import argparse
from pathlib import Path

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "input_json",
        type=Path)
    parser.add_argument(
        "output_list",
        type=Path)

    args = parser.parse_args()

    with open(args.input_json, 'r') as data:
        struct = json.load(data)

    with open(args.output_list, 'w') as f:
        filelist = sorted(list(set([f for l in struct.values() for f in l])))
        for line in filelist:
            print(line)
            f.writelines(line + '\n')
