| /* | |
| * yosys -- Yosys Open SYnthesis Suite | |
| * | |
| * Copyright (C) 2012 Clifford Wolf <clifford@clifford.at> | |
| * | |
| * 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 COST_H | |
| #define COST_H | |
| #include "kernel/yosys.h" | |
| YOSYS_NAMESPACE_BEGIN | |
| struct CellCosts | |
| { | |
| static const dict<RTLIL::IdString, int>& default_gate_cost() { | |
| static const dict<RTLIL::IdString, int> db = { | |
| { ID($_BUF_), 1 }, | |
| { ID($_NOT_), 2 }, | |
| { ID($_AND_), 4 }, | |
| { ID($_NAND_), 4 }, | |
| { ID($_OR_), 4 }, | |
| { ID($_NOR_), 4 }, | |
| { ID($_ANDNOT_), 4 }, | |
| { ID($_ORNOT_), 4 }, | |
| { ID($_XOR_), 5 }, | |
| { ID($_XNOR_), 5 }, | |
| { ID($_AOI3_), 6 }, | |
| { ID($_OAI3_), 6 }, | |
| { ID($_AOI4_), 7 }, | |
| { ID($_OAI4_), 7 }, | |
| { ID($_MUX_), 4 }, | |
| { ID($_NMUX_), 4 } | |
| }; | |
| return db; | |
| } | |
| static const dict<RTLIL::IdString, int>& cmos_gate_cost() { | |
| static const dict<RTLIL::IdString, int> db = { | |
| { ID($_BUF_), 1 }, | |
| { ID($_NOT_), 2 }, | |
| { ID($_AND_), 6 }, | |
| { ID($_NAND_), 4 }, | |
| { ID($_OR_), 6 }, | |
| { ID($_NOR_), 4 }, | |
| { ID($_ANDNOT_), 6 }, | |
| { ID($_ORNOT_), 6 }, | |
| { ID($_XOR_), 12 }, | |
| { ID($_XNOR_), 12 }, | |
| { ID($_AOI3_), 6 }, | |
| { ID($_OAI3_), 6 }, | |
| { ID($_AOI4_), 8 }, | |
| { ID($_OAI4_), 8 }, | |
| { ID($_MUX_), 12 }, | |
| { ID($_NMUX_), 10 } | |
| }; | |
| return db; | |
| } | |
| dict<RTLIL::IdString, int> mod_cost_cache; | |
| const dict<RTLIL::IdString, int> *gate_cost = nullptr; | |
| Design *design = nullptr; | |
| int get(RTLIL::IdString type) const | |
| { | |
| if (gate_cost && gate_cost->count(type)) | |
| return gate_cost->at(type); | |
| log_warning("Can't determine cost of %s cell.\n", log_id(type)); | |
| return 1; | |
| } | |
| int get(RTLIL::Cell *cell) | |
| { | |
| if (gate_cost && gate_cost->count(cell->type)) | |
| return gate_cost->at(cell->type); | |
| if (design && design->module(cell->type) && cell->parameters.empty()) | |
| { | |
| RTLIL::Module *mod = design->module(cell->type); | |
| if (mod->attributes.count(ID(cost))) | |
| return mod->attributes.at(ID(cost)).as_int(); | |
| if (mod_cost_cache.count(mod->name)) | |
| return mod_cost_cache.at(mod->name); | |
| int module_cost = 1; | |
| for (auto c : mod->cells()) | |
| module_cost += get(c); | |
| mod_cost_cache[mod->name] = module_cost; | |
| return module_cost; | |
| } | |
| log_warning("Can't determine cost of %s cell (%d parameters).\n", log_id(cell->type), GetSize(cell->parameters)); | |
| return 1; | |
| } | |
| }; | |
| YOSYS_NAMESPACE_END | |
| #endif |