Скачиваний:
92
Добавлен:
16.07.2022
Размер:
11.41 Mб
Скачать

Приложение б Структура макроблока кмд

В данном приложении представлена таблица соответствия имён разработанных ячеек и имён, используемых для корректной работы программы генерации топологии макроблока, а также его структура (таблица Б.1).

Таблица Б.1 – Соответствие названий ячеек делителя

Наименование ячейки

Новое имя ячейки

Содержание ячеек

buff

str1_1m

Раскачивающий строку буфер

basc_together_left

str1_2m

Левая основная ячейка, имеющая соединение с буфером

basc_together

str1_3m

Средняя основная ячейка, имеющая соединение с левой и правой основными ячейками

basc_together_right_top

str1_4m

Верхняя правая основная ячейка, имеющая соединение с триггерами и с единичным переносом для инициализации вычитания

trigg_right_top_1

str1_5m

Верхняя ячейка триггеров справа от основной ячейки

trigg_right_top_2

str1_6m

Верхняя правая ячейка триггеров

basc_together_right

str2_4m

Правая основная ячейка, имеющая соединение с триггерами

trigg_right_together_1

str2_5m

Ячейка триггеров справа от основной ячейки

trigg_right_together_2

str2_6m

Самая правая ячейка триггеров

trigg_right_together_e_1

strE1_6m

Верхняя ячейка триггеров справа, объединяющая триггеры str1_5 и str1_6

trigg_right_together_e_2

strE2_6m

Ячейка триггеров справа, объединяющая триггеры str2_5 и str2_6

trigg_right_together_top_double

strT1_6m

Верхняя правая ячейка триггеров в случае только одной ячейки триггеров

trigg_right_together_double

strT2_6m

Правая ячейка триггеров в случае только одной ячейки триггеров

Приложение в Текст программы генерации спецификации структурно-топологических схем кмд различной разрядности

В данном приложении приведён текст программы на языке C++, генерирующий спецификацию структурно-топологической схемы КМД по заданному количеству разрядов делимого и делителя.

// Генерация спецификации КМД различной разрядности

#include <fstream>

#include <iostream>

#include <cmath>

#include <string>

using namespace std;

int main()

{

setlocale(LC_ALL, "Russian");

string nameFile = "divider_conv_auto.txt";

ofstream fout(nameFile, ios_base::out | ios_base::trunc);

cout << "----------------------------------------------------------" << endl;

cout << "Программа генерации спецификации КМД различной разрядности" << endl;

cout << "----------------------------------------------------------" << endl;

cout << endl;

if (!fout.is_open())

{

cout << "Файл " << nameFile << " не может быть открыт!" << endl;

cout << "Исправьте проблему и попробуйте снова." << endl;

system("pause");

exit(0);

}

else

{

int m = 0, n = 0, summ = 0;

cout << "Введите количество разрядов делимого, кратное 8:" << endl;

cin >> m;

if (cin.get() != (int)'\n')

{

cout << "Ошибка ввода! Необходимо ввести целое число!" << endl;

system("pause");

exit(0);

}

else

{

if (m <= 0)

{

cout << "Ошибка ввода! Количество разрядов должно быть больше нуля!" << endl;

system("pause");

exit(0);

}

}

cout << "Введите количество разрядов делителя, кратное 8:" << endl;

cin >> n;

if (cin.get() != (int)'\n')

{

cout << "Ошибка ввода! Необходимо ввести целое число!" << endl;

system("pause");

exit(0);

}

else

{

if (n <= 0)

{

cout << "Ошибка ввода! Количество разрядов должно быть больше нуля!" << endl;

system("pause");

exit(0);

}

else

{

if (m < n)

{

cout << "Ошибка ввода! Количество разрядов делимого не может быть ";

cout << "меньше, чем у делителя!" << endl;

system("pause");

exit(0);

}

else

{

//Несмотря на то, что запрашивается количество разрядов кратное 8,

//главное то, чтобы они были чётными, а разница разрядов делимого и

//делителя была кратной 8

if ((m % 2 != 0) && (n % 2 != 0))

{

cout << "Ошибка ввода! Количество разрядов должно быть ";

cout << "чётным!" << endl;

system("pause");

exit(0);

}

else

if ((m - n) % 8 != 0)

{

cout << "Ошибка ввода! Разница разрядов делимого и ";

cout << "делителя должна быть кратной 8!" << endl;

system("pause");

exit(0);

}

}

}

}

if ((n < 4) || (n % 4 != 0))

{

cout << "Ошибка ввода! Количество разрядов делителя должно быть ";

cout << "кратно 4 и не меньше 4!" << endl;

system("pause");

exit(0);

}

fout << "C:\\TopVG" << endl;

fout << "C:\\TopVG\\EXAMPLES\\Divider" << endl;

fout << "C:\\TopVG\\EXAMPLES\\Divider\\M1.2" << endl;

//Формирование первой строки

int k = 0, sqrt_k = 0;

int k_diff = (m - n) / 8;

fout << "S1 :g str1_1m str1_1m , 1 ; ";

switch (n)

{

case 4:

{

fout << "strD1_4m strD1_4m , 1 ; ";

break;

}

case 8:

{

fout << "str1_2m str1_2m , 1 ; str1_4m str1_4m , 1 ; ";

break;

}

default:

{

fout << "str1_2m str1_2m , 1 ; ";

k = (n - 8) / 4;

do

{

sqrt_k = trunc(sqrt(k));

k = k - pow(sqrt_k, 2);

fout << "str1_3m str1_3m , " << sqrt_k << " ; ";

} while (k != 0);

fout << "str1_4m str1_4m , 1 ; ";

break;

}

}

//Определяем количество блоков триггеров справа

switch (k_diff)

{

case 0:

{

fout << "strT1_6m strT1_6m , 1 ; EOL";

break;

}

case 1:

{

fout << "strT1_6m strT1_6m , 1 ; EOL";

break;

}

case 2:

{

fout << "str1_5m str1_5m , 1 ; str1_6m str1_6m , 1 ; EOL";

break;

}

default:

{

fout << "str1_5m str1_5m , 1 ; ";

k_diff = k_diff - 2;

do

{

sqrt_k = (int)trunc(sqrt(k_diff));

k_diff = k_diff - pow(sqrt_k, 2);

fout << "strE1_6m strE1_6m , " << sqrt_k << " ; ";

} while (k_diff != 0);

fout << "str1_6m str1_6m , 1 ; EOL";

break;

}

}

fout << endl;

if (m - n)

{

//Формирование второй строки

k_diff = (m - n) / 8;

fout << "S2 :g str1_1m str1_1m , 1 ; ";

switch (n)

{

case 4:

{

fout << "strD2_4m strD2_4m , 1 ; ";

break;

}

case 8:

{

fout << "str1_2m str1_2m , 1 ; str2_4m str2_4m , 1 ; ";

break;

}

default:

{

fout << "str1_2m str1_2m , 1 ; ";

k = (n - 8) / 4;

do

{

sqrt_k = (int)trunc(sqrt(k));

k = k - pow(sqrt_k, 2);

fout << "str1_3m str1_3m , " << sqrt_k << " ; ";

} while (k != 0);

fout << "str2_4m str2_4m , 1 ; ";

break;

}

}

//Определяем количество блоков триггеров справа

switch (k_diff)

{

case 0:

{

fout << "strT2_6m strT2_6m , 1 ; EOL";

break;

}

case 1:

{

fout << "strT2_6m strT2_6m , 1 ; EOL";

break;

}

case 2:

{

fout << "str2_5m str2_5m , 1 ; str2_6m str2_6m , 1 ; EOL";

break;

}

default:

{

fout << "str2_5m str2_5m , 1 ; ";

k_diff = k_diff - 2;

do

{

sqrt_k = trunc(sqrt(k_diff));

k_diff = k_diff - pow(sqrt_k, 2);

fout << "strE2_6m strE2_6m , " << sqrt_k << " ; ";

} while (k_diff != 0);

fout << "str2_6m str2_6m , 1 ; EOL";

break;

}

}

fout << endl;

}

//Итоговая компиляция из сформированных строк

fout << "divider_conv_auto :v S1 , 1 ;";

if (m - n)

{

fout << " S2 , " << (m - n) << " ; EOL";

}

else

{

fout << " EOL";

}

fout.close();

cout << "Спецификация '" << nameFile << "' успешно создана!" << endl;

system("pause");

}

}