Transformace do CCS je řešena metodou GEditor::getCCSdf, která volá metody GBox::getRestriction a GBox::getRelabeling. Tyto metody implementují algoritmus navržený v kapitole na straně
. V této sekci popíšeme technické prvky jeho implementace a zejména úpravu pro změnu v syntaxi GCCS, kterou jsme zavedli možností vzájemného propojení dvou portů bez nutnosti použít sběrnici.
Postupně procházíme všechna rozhraní sítě a voláním výše uvedených metod pro každé z nich vypočítáme globální (celého systému na dané úrovni abstrakce) a lokální (podsystémů) restrikce a přejmenování. Pokud je na rozhraní napojena podsíť, voláme její metodu GEditor::getCCSdf, čímž získáme CCS výraz podsystému. Pokud není podsíť napojena, využijeme textového řetězce CCS popisujícího podsystém (není-li prázdný, jinak definujeme podsystém jako proces nil). V těchto metodách používáme datových struktur, jejichž přehled je uveden v tabulce .
Table: Tabulka datových struktur použivaných při transformaci do CCS
-1
1
Vnitřní sběrnice v síti mají prázdné jméno. Z toho důvodu musíme takové vnitřní sběrnice, které jsou pro transformaci významné (tj. jsou napojeny na nějaký port), pro účely transformace pojmenovat různými interními jmény (viz v algoritmu z kapitoly
). Pomocí těchto jmen se budou příslušné porty synchronizovat a tato interní jména budou součástí globální restrikce R. Po ukončení transformace je nutno jména těchto sběrnic opět nahradit prázdným řetězcem. K tomu slouží právě seznam intb. Ke generování jmen interních sběrnic se používá aktuální hodnoty proměnné l. Aby nedocházelo ke konfliktu jmen akcí, zvolili jsme následující tvar: '', kde za l se dosadí příslušná hodnota.
Výpočet globálního přejmenování F se provádí postupně procházením volných portů a pojmenovaných sběrnic podsystémů. Abychom zaručili jednoznačné ošetřující jméno pro každý problémový port, generujeme toto jméno pomocí čítače r, který pro každý problémový port inkrementujeme.
Extenzi syntaxe GCCS o možnost propojení dvou portů překládáme do CCS jako propojení portů přes vnitřní sběrnici. Přitom musíme zajistit jednoznačné jméno této pomyslné sběrnice (představující komunikační akci, na níž jsou synchronizovány příslušné podsystémy). Abychom zaručili přejmenování obou portů na stejné interně vygenerované jméno, uložíme jej do tabulky com_port_map k ukazateli na partnera prvně procházeného procesu. Partnerský port si potom z tabulky toto jméno převezme. Pro zajištění jednoznačnosti jmen jsme zvolili následující tvar tohoto interního jména: '', kde za port1 se dosadí jméno počátečního portu spoje a za port2 jméno jeho partnera (tedy koncového portu spoje). Pro zajištění jednoznačnosti propojení v případě, že se dané jméno portu vyskytuje u více dvojic vzájemně propojených portů v síti, je součástí interního jména číslo k vyjadřující aktuální počet položek v tabulce com_port_map. Vzhledem ke způsobu konstrukce této tabulky toto číslo zajišťuje jednoznačnost generovaného jména.
Schematický popis implementace:
Schematický popis metody GBox::getRelabeling:
Výsledný kód CCS je zobrazen v jednoduchém textovém editoru, z něhož je možné jej exportovat do textového souboru (kompatibilního s programem CWB-NC).
Implementace seznamu problémových portů pomocí setříděného seznamu zefektivňuje prohledávání v kroku (). Výpočet průniku množin portů (rozhraní) z návrhu algoritmu je řešen logaritmickým vyhledáváním portů v tomto seznamu. Konstrukce tohoto seznamu se při analýze každé sítě provádí vždy jedenkrát sekvenčním průchodem setříděným seznamem všech jejích volných portů, z něhož vybereme problémové lineárním průchodem tak, že přidáme vždy port, jehož jméno se vyskytuje v procházeném seznamu alespoň dvakrát. Procházený seznam je setříděný, stačí tedy při průchodu porovnávat jména předchozího a aktuálního portu. Zkonstruovaný seznam v čase setřídíme (knihovní metoda QList::sort).