blob: 245d4bd3626a71ab8429c609684eebc522f592ea [file] [log] [blame]
/*
* 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