| /* | |
| * yosys -- Yosys Open SYnthesis Suite | |
| * | |
| * Copyright (C) 2012 Clifford Wolf <clifford@clifford.at> | |
| * Copyright (C) 2019 The Symbiflow Authors | |
| * | |
| * 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. | |
| * | |
| * --- | |
| * | |
| * FASM backend | |
| * | |
| * This plugin writes out the design's fasm features based on the parameter | |
| * annotations on the design cells. | |
| */ | |
| #include "../common/bank_tiles.h" | |
| #include "kernel/log.h" | |
| #include "kernel/register.h" | |
| #include "kernel/rtlil.h" | |
| USING_YOSYS_NAMESPACE | |
| PRIVATE_NAMESPACE_BEGIN | |
| struct WriteFasm : public Backend { | |
| WriteFasm() : Backend("fasm", "Write out FASM features") {} | |
| void help() override | |
| { | |
| // |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---| | |
| log("\n"); | |
| log(" write_fasm -part_json <part_json_filename> <filename>\n"); | |
| log("\n"); | |
| log("Write out a file with vref FASM features.\n"); | |
| log("\n"); | |
| } | |
| void execute(std::ostream *&f, std::string filename, std::vector<std::string> args, RTLIL::Design *design) override | |
| { | |
| size_t argidx = 1; | |
| std::string part_json; | |
| if (args[argidx] == "-part_json" && argidx + 1 < args.size()) { | |
| part_json = args[++argidx]; | |
| argidx++; | |
| } | |
| extra_args(f, filename, args, argidx); | |
| extract_fasm_features(f, design, part_json); | |
| } | |
| void extract_fasm_features(std::ostream *&f, RTLIL::Design *design, const std::string &part_json) | |
| { | |
| RTLIL::Module *top_module(design->top_module()); | |
| if (top_module == nullptr) { | |
| log_cmd_error("%s: No top module detected.\n", pass_name.c_str()); | |
| } | |
| auto bank_tiles = get_bank_tiles(part_json); | |
| // Generate a fasm feature associated with the INTERNAL_VREF value per bank | |
| // e.g. VREF value of 0.675 for bank 34 is associated with tile HCLK_IOI3_X113Y26 | |
| // hence we need to emit the following fasm feature: HCLK_IOI3_X113Y26.VREF.V_675_MV | |
| for (auto cell : top_module->cells()) { | |
| if (!cell->hasParam(ID(FASM_EXTRA))) | |
| continue; | |
| if (cell->getParam(ID(FASM_EXTRA)) == RTLIL::Const("INTERNAL_VREF")) { | |
| if (bank_tiles.size() == 0) { | |
| log_cmd_error("%s: No bank tiles available on the target part.\n", pass_name.c_str()); | |
| } | |
| int bank_number(cell->getParam(ID(NUMBER)).as_int()); | |
| if (bank_tiles.count(bank_number) == 0) { | |
| log_cmd_error("%s: No IO bank number %d on the target part.\n", pass_name.c_str(), bank_number); | |
| } | |
| int bank_vref(cell->getParam(ID(INTERNAL_VREF)).as_int()); | |
| *f << "HCLK_IOI3_" << bank_tiles[bank_number] << ".VREF.V_" << bank_vref << "_MV\n"; | |
| } | |
| } | |
| } | |
| } WriteFasm; | |
| PRIVATE_NAMESPACE_END |