Koncepcja refaktoryzacji kodu w języku VHDL VIII Krajowa Konferencja Naukowa RUC'2005 REPROGRAMOWALNE UKŁADY CYFROWE Koncepcja refaktoryzacji kodu w języku VHDL Przemysław Sołtan e-mail: kerk@ie.tu.koszalin.pl
Wprowadzenie Koncepcja refaktoryzacji Przykład prostego przekształcenia Model dokumentu (drzewo AST) Złożona refaktoryzacja kodu Platforma ECLIPSE i projekt VDT (Vhdl Development Toolkit) Kierunki rozwoju projektu Podsumowanie
Przebieg procesu projektowego granica spełnienia zadanej funkcjonalność funkcjonalność Automatyzacja niektórych czynności może wpłynąć na skrócenie czasu modyfikacji kodu czas Obszary czasu przeznaczane na modyfikację kodu bez rozszerzania jego funkcjonalności
Koncepcja refaktoryzacji Termin refaktoryzacja definiuje się jako mechanizm zmiany struktury kodu bez zmiany jego zachowania (funkcjonalności) ułatwienie pielęgnacji kodu projektu (modyfikacje) sprawdzanie integralności zawartych danych i ich zgodności z semantyką języka na poziomie edycji kodu mechanizmy automatycznego generowania dodatkowego kodu
Koncepcja refaktoryzacji Projekt VHDL (przed refaktoryzacją) PARSER (drzewo AST) Biblioteka do refaktoryzacji Projekt VHDL (po refaktoryzacji) Aktualizacja widoku Polecenie refaktoryzacji Widok Użytkownika Edytor Model View Controller Mechanizmy: analiza kodu źródłowego (parser) do budowy modelu (drzewa AST) edytor wraz z widokami do komunikacji z użytkownikiem biblioteka do kontroli procesu refaktoryzacji
Refaktoryzacja i język VHDL Języki obiektowe (Java, C++) operują na podstawowych elementach jak: zmienne, funkcje i klasy. Języki obiektowe (Java, C++) złożone mechanizmy: dziedziczenia, poliformizmu, ... VHDL dużo większa liczba elementarnych typów: zmienne, sygnały, porty, entity, architektury, ... (złożoność mechanizmów modyfikacji nazw) VHDL przekształcenia uwzględniające współbieżność (procesy), operacje na pakietach oraz konfiguracjach kodu (do ustalenia i realizacji).
Przykład prostego przekształcenia entity entityOldName is port(in1 : in bit; out1 : out bit); end entityOldName ; architecture architectureName1 of entityOldName is begin -- code end architectureName1; architecture architectureName2 of entityOldName is end architectureName2; entity entityTestName is end entityTestName; architecture architectureTestName of entityTestName is component entityOldName end component ; comp1: entityOldName port map (in1,out1); -- rest of port map component end architectureTestName; Przykładowy kod VHDL entityNewName ARCHITECTURE PORT MAP ... COMPONENT ENTITY
Przykład prostego przekształcenia Proces zmiany nazwy entity wymusza realizację kilku elementarnych operacji: wskazanie elementu określającego starą nazwę entity (entityOldName) i podania nowej nazwy (entityNewName); sprawdzenie, czy nowa nazwa nie koliduje z już istniejącymi nazwami; wyszukanie bloku danego entity (zmiana nazwy); wyszukanie architektur dla danego entity (zmiana nazwy); wyszukanie w blokach architektur komponentów danego entity (zmiana nazwy); wyszukanie wszystkich mapowań komponentów danego entity (zmiana nazwy). entityNewName ARCHITECTURE PORT MAP ... COMPONENT ENTITY
Model dokumentu drzewo AST (Abstract Syntax Tree) AST E ENTITY (name: entityOldName ) P PORT (name:in1,type:in,type2:bit) P PORT (name:out1,type:out,type2:bit) A ARCHITECTURE (name:architectureName1,entity: entityOldName ) A ARCHITECTURE (name:architectureName2,entity: entityOldName ) E ENTITY (name:entityTestName) P PORT (name:in1,type:in,type2:bit) P PORT (name:out1,type:out,type2:bit) A ARCHITECTURE (name:architectureTestName,entity:entityTestName) C COMPONENT (name: entityOldName ) P PORT (name:in1,type:in,type2:bit) entityNewName P PORT (name:out1,type:out,type2:bit) I INSTANCE (name:comp1, type: entityOldName ) Przy wyszukiwaniu wystarczy analizować tylko określone węzły drzewa M MAP (from:in1, to:in1) M MAP (from:out1, to:out1)
Złożona refaktoryzacja kodu EDYTOR Projekt VHDL PLIK1.vhd MODEL AST BIBLIOTEKI PLIK2.vhd STANDARD PLIK3.vhd IEEE mała Złożoność przekształceń: elementarne metody przeszukiwania drzewa elementarne przekształcenia (rename, move, delete, insert) złożone przekształcenia realizowane na bazie sekwencji prostych przekształceń (transakcje i praca na kopii roboczej) duża
Katalog wzorców VHDL?! Przykłady do ewentualnej implementacji: Podstawowym celem jest selekcja i wybór takich rozwiązań, które zostaną zaimplementowane w aplikacji do refaktoryzacji kody VHDL Opis wzorca powinien zawierać (motywację, mechanizm oraz przykłady) Przykłady do ewentualnej implementacji: Zamiana instrukcji if na case i na odwrót; Wyszukiwanie nieużywanych fragmentów kodu (np. zbędnych sygnałów) Podział komponentu (ekstrakcja części kodu do nowego komponentu) Wstawianie/ modyfikacja portów w blokach entity (automatyczna aktualizacja bloków component i port map) Generacja/aktualizacja testbenchy Wstrzykiwanie kodu asercji i ich automatyczne usuwanie
Platforma ECLIPSE ECLIPSE – darmowe narzędzie projektowe IDE Bogactwo projektów i wtyczek (plug-ins) Darmowe rozwiązanie nawet do zastosowań komercyjnych. Rewelacyjne mechanizmy refaktoryzacji dostępne dla języków obiektowych: Java i C++ Integracja różnego typu technologii w jednym narzędziu: J2EE, XML, PHP, Perl, Python, ... VERILOG http://veditor.sourceforge.net/ VHDL brak??! Potężne wsparcie przemysłu $$$ - projekt jest rozwijany przez etatowych programistów
Embedded Development Kit (EDK) Kto „lubi” ECLIPSE? Embedded Development Kit (EDK) Nios II Embedded Processors
VDT - architektura Platforma ECLIPSE modułowa budowa (Plug-ins): ECLIPSE PLATFORM VDT PROJECT CORE SCANNER PARSER AST MODEL WORKBENCH PDE UI EDITOR OUTLINE Platforma ECLIPSE modułowa budowa (Plug-ins): wtyczki JDT, CDT, PyDEV do refaktoryzacji kodu określonych języków (java, C++, python) VDT – wtyczka do refaktoryzacji kodu VHDL (pakiety CORE oraz UI) licencja CPL - http://www.eclipse.org/legal/cpl-v10.html
VDT - edytor kodu
VDT - rozwój biblioteki Integracja z biblioteką LTK (Eclipse Language Toolkit) wspierającą mechanizmy refaktoryzacji Opracowanie zestawu testów (przykłady do katalogu wzorców) Generacja dokumentacji (HTML) na podstawie modelu (na wzór JavaDoc) Integracja narzędzia z zewnętrznym symulatorem VHDL (FreeVHDL?!) Wydanie stabilnej wersji projektu – aktualnie jest to wersja eksperymentalna http://kik.ie.tu.koszalin.pl/mvl/vdt