Добавление нового генератора

Для добавления новых генераторов необходимо внести корректировки в следующие файлы:

1.1

В файле необходимо отредактировать перечисление типа GenerationTypes, добавив в него название генератора. В качестве примера назовем его NewGeneratorName.

1.2

В этом же необходимо внести изменения в поле generationTypeToPrefix. Необходимо добавить новый префикс для генерируемых в результате файлов формата .v, .json и других. Префикс должен начинаться с трех букв — CCG. Далее следует аббревиатура названия метода генерации. Используя название генератора из примера, получаем следующую вставку: {GenerationTypes::NewGeneratorName, "CCGNGN"} CCGCombinational Circuit Generator, вместо NGN можно указать более подходящее на взгляд автора обозначения для созданного метода генерации.

2.

В файле необходимо создать новый класс, в который нужно будет добавить дополнительные параметры для использования нового генератора. Название класса должно соответствовать требованию: Generator + <имя генератор> + Parameters. Используя генератор из примера, назовем класс так: GeneratorNewGeneratorNameParameters.

Далее необходимо в классе GenerationParameters создать в разделе private переменную ранее созданного класса. Название переменной соответствует следующему требованию: d_generator + <имя генератор> + Parameters. Для примера переменная будет иметь следующее название: d_generatorNewGeneratorNameParameters. Для данной переменной необходимо создать геттер и сеттер. Геттер возвращает саму переменную, сеттер — получает на вход переменные для данного класса и записывает в переменную с параметрами.

3.

Реализация — в отдельном классе в каталоге src/generators/simple/<имя>/ (см. пример arithmetic/ArithmeticGenerator.hpp), обычно как наследник SimpleGenerator. В заголовке генератора добавьте объявление метода: GraphPtr generatorNewGeneratorName(...); В качестве результата метод должен возвращать сгенерированную схему в формате GraphPtr, который, в свою очередь, является псевдонимом для типа std::shared_ptr<OrientedGraph>. В качестве входных данных метод должен принимать все необходимые для его использования переменные.

В соответствующем .cpp реализуйте метод:

GraphPtr NewGeneratorName::generatorNewGeneratorName(...) {
   ...
}

4.

В классе DataBaseGenerator необходимо реализовать метод, который будет на вход получать константную ссылку на параметры генерации i_param, которая содержит все необходимые параметры генерации. В данном методе необходимо создать объект вашего класса генератора (наследника SimpleGenerator) и вызвать в нем ранее созданный метод, в который нужно передать все необходимые параметры из i_param в том же порядке, в котором они были описаны в реализации метода. Результат необходимо записать в переменную типа GraphPtr. После этого необходимо создать переменную типа Circuit и в качестве параметра конструктора передать полученный граф. После этого необходимо задать путь генерации (setPath) в качестве которого выступает d_mainPath. Также нужно задать название схемы (setCircuitName) присутствующее в параметрах генерации (i_param.getName()). После этого необходимо запустить генерацию схемы в формате Verilog и обсчет параметров (generate), передав набор параметров: i_param.getMakeGraphMLClassic(), i_param.getMakeGraphMLPseudoABCD(), i_param.getMakeGraphMLOpenABCD().

Используя приведенные ранее примеры названий методов, получаем следующий код для реализации метода:

void DataBaseGenerator::generateNewGeneratorName(GenerationParameters &i_param) {
  NewGeneratorName sg(i_param);
  ...
  GraphPtr graph = sg.generatorNewGeneratorName(...);
  Circuit c (graph);
  c.setPath(d_mainPath);
  c.setCircuitName(i_param.getName());
  c.generate(
    i_param.getMakeGraphMLClassic(),
    i_param.getMakeGraphMLPseudoABCD(),
    i_param.getMakeGraphMLOpenABCD()
  );
}

И код для описания метода в header: void generateNewGeneratorName(const GenerationParameters& i_param); Далее в файле DataBaseGenerator.cpp необходимо в функции getGenerateMethod реализовать обработку нового имени генератора (новый case в switch-конструкции). Используя название генератора из примера, получаем следующую вставку:

case GenerationTypes::NewGeneratorName:
  generateMethodFunc = &DataBaseGenerator::generateNewGeneratorName;
  break;

5.

Последним шагом является редактирование файла CircuitGenGenerator.cpp. В функцию runGenerationFromJson после инициализации GenerationTypes gt необходимо добавить условие на выбор метода генерации. Используя ранее заданное название генератора в качестве примера, получим следующий участок кода:

else if (data["type_of_generation"] == "NewGeneratorName")
  gt = GenerationTypes::NewGeneratorName;

Если для работы генератора требуются дополнительные параметры, то следует обратиться к переменной data, содержащей данные из json-файла с параметрами для генерации, и передать их в класс GenerationParameters (имя переменной — gp) с помощью созданного ранее сеттера: gp.setNewGeneratorNameParameters(...); На этом добавление генератора в программу закончено. Для непосредственной работы самого генератора необходимо создать файл json с соответствующими созданному генератору параметрами генерации.