/*
 *  yosys -- Yosys Open SYnthesis Suite
 *
 *  Copyright (C) 2012  Clifford Wolf <clifford@clifford.at>
 *                2019  Eddie Hung <eddie@fpgeh.com>
 *
 *  Permission to use, copy, modify, and/or distribute this software for any
 *  purpose with or without fee is hereby granted, provided that the above
 *  copyright notice and this permission notice appear in all copies.
 *
 *  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 *  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 *  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 *  ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 *  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 *  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 *  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 *
 */

#ifndef ABC_AIGERPARSE
#define ABC_AIGERPARSE

#include "kernel/yosys.h"

YOSYS_NAMESPACE_BEGIN

struct AigerReader
{
    RTLIL::Design *design;
    std::istream &f;
    RTLIL::IdString clk_name;
    RTLIL::Module *module;
    std::string map_filename;
    bool wideports;

    unsigned M, I, L, O, A;
    unsigned B, C, J, F; // Optional in AIGER 1.9
    unsigned line_count;
    uint32_t piNum, flopNum;

    std::vector<RTLIL::Wire*> inputs;
    std::vector<RTLIL::Wire*> latches;
    std::vector<RTLIL::Wire*> outputs;
    std::vector<RTLIL::Wire*> bad_properties;
    std::vector<RTLIL::Cell*> boxes;

    AigerReader(RTLIL::Design *design, std::istream &f, RTLIL::IdString module_name, RTLIL::IdString clk_name, std::string map_filename, bool wideports);
    void parse_aiger();
    void parse_xaiger(const dict<int,IdString> &box_lookup);
    void parse_aiger_ascii();
    void parse_aiger_binary();
    void post_process();
};

YOSYS_NAMESPACE_END

#endif
