blob: 1663f955bdcc319d2c009139714cdef7e2378ec8 [file] [log] [blame]
// Copyright 2022 AUC Open Source Hardware Lab
//
// 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
#include "kernel/yosys.h"
USING_YOSYS_NAMESPACE
#include <iostream>
struct CLK_Gating_Pass : public Pass {
CLK_Gating_Pass() : Pass("reg_clock_gating", "performs flipflop clock gating") {}
void help() override
{
// |---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|---v---|
log("\n");
log(" reg_clock_gating [-map CG_map_filename] [selection]\n");
log("\n");
log("\n");
log(" -map filename\n");
log(" the mapfile for clock gating cells implementations to be used.\n");
log(" maps from enable-flipflops to clock gated flipflops.\n");
log(" without this parameter a builtin library is used that\n");
log(" transforms the internal RTL cells to the internal gate\n");
log(" library.\n");
log(" check techmap command for mare details.\n");
log(" selection\n");
log(" this option is used to specify the flipflops to be clockgated.\n");
log(" for example:.\n");
log(" put the following attribute in you design: \n");
log(" (* clock gating *).\n");
log(" and use the following command: .\n");
log(" reg_clock_gating -map CG_map_filename.v a:clock_gate.\n");
log("\n");
log("This pass calls the following passes to perform technology mapping \n");
log("of enabled flip_flops to clock-gated flipflops.\n");
log("\n");
log(" procs\n");
log(" opt;;\n");
log(" memory_collect\n");
log(" memory_map\n");
log(" opt;; \n");
log(" techmap -map [-map CG_map_filename] [selection]\n");
log(" opt;;\n");
log("\n");
}
virtual void execute(std::vector<std::string> args, RTLIL::Design *design)
{
if (args.size() < 2) {
log_error("Incorrect number of arguments \nClock gating map file is required \n");
}
string map_file = "";
size_t argidx;
for (argidx = 1; argidx < args.size(); argidx++) {
if (args[argidx] == "-map" && argidx + 1 < args.size()) {
map_file = args[++argidx];
continue;
}
break;
}
int x = 0;
std::stringstream selection_string_stream;
for (unsigned long i = argidx; i < args.size(); i++) {
if (x != 0)
selection_string_stream << " ";
selection_string_stream << args[i];
x++;
}
std::string selection = selection_string_stream.str();
std::cout << selection << "\n";
log_header(design, "Executing Clock gating pass.\n");
log_push();
Pass::call(design, "proc");
Pass::call(design, "opt;;");
Pass::call(design, "memory_collect " + selection);
Pass::call(design, "memory_map " + selection);
Pass::call(design, "opt;;");
Pass::call(design, "techmap -map " + map_file + " " + selection);
Pass::call(design, "opt;;");
design->optimize();
design->sort();
design->check();
log_header(design, "Finished Clock gating pass.\n");
log_pop();
}
} CLK_Gating_Pass;