|  | /* | 
|  | * Copyright 2020-2022 F4PGA 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 | 
|  | * | 
|  | *     http://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. | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | * | 
|  | *  --- | 
|  | * | 
|  | *   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 |