Tworzenie szybko symboli schematycznych o dużej liczbie pinów

Mark Harris
|  Utworzono: grudzień 31, 2019  |  Zaktualizowano: styczeń 4, 2021
Tworzenie szybko symboli schematycznych o dużej liczbie wyprowadzeń

Moja otwartoźródłowa biblioteka komponentów Altium zawiera setki symboli schematycznych, dostarczając ponad 100 000 komponentów do użytku. Ludzie często są zaskoczeni, gdy mówię im, że stworzenie symbolu schematycznego w Altium zajmuje tylko kilka minut, nawet jeśli część ma dużą liczbę pinów. W tym artykule chcę pokazać, jak możesz wykorzystać niektóre narzędzia w Altium, aby szybko tworzyć własne symbole.

Wymagania wstępne

Zanim zaczniemy, potrzebujesz kilku rzeczy:

  • Dobry datasheet lub plik z definicjami pinów w formacie tekstowym. Ten artykuł będzie opierał się na datasheecie PDF.
  • Pewna znajomość wyrażeń regularnych. Preferuję pracę z wersją .NET, ponieważ ma kilka ciekawych funkcji.
  • Jakiś program do arkuszy kalkulacyjnych. Będę używać Google Sheets, ale Microsoft Excel czy OpenOffice również dobrze się sprawdzą.

Rozpoczynanie pracy nad symbolem

Aby znaleźć część do użycia w tym artykule, udałem się na stronę Digi-Key i przejrzałem kategorię Embedded - Mikrokontrolery w poszukiwaniu dostępnego w magazynie mikrokontrolera ARM Cortex M z wbudowaną pamięcią FLASH i więcej niż 100 pinami GPIO. Następnie posortowałem wyniki według dostępnej ilości, i zwycięzcą jest NXP MK64FN1M0VLQ12. Wygląda na to, że to ładny mikrokontroler w obudowie LQFP-144. Kopiowanie i wklejanie opisów pinów dla każdego pinu w tej obudowie byłoby czasochłonne, nudne i podatne na błędy, więc lepiej tego nie róbmy!

Patrząc na datasheet tego elementu, tabela rozpiski pinów (5.1, Strona 68) nie jest idealna dla tego procesu, ale to w porządku—datasheety rzadko kiedy są idealne do tworzenia symboli.

Zanim szczegółowo opiszę, jak stworzyć ten komponent, sam przeszedłem przez ten proces, aby upewnić się, że nie pominę żadnego kroku podczas pisania artykułu. Zajęło mi to nieco ponad 7 minut, aby stworzyć tę część z 144 pinami, co jest dla mnie trochę wolno. Gdyby dane w karcie katalogowej nie wymagały takiego porządkowania, zajęłoby to około 4-5 minut. Jednakże stworzyłem już prawie 500 takich symboli, więc mam trochę doświadczenia, które pomaga mi szybko wykonywać pracę!

Pierwszą rzeczą, którą zrobimy w Altium, będzie utworzenie nowej biblioteki schematycznej, przechodząc do Plik -> Nowy -> Biblioteka -> Biblioteka Schematyczna.


Następnie, w nowym komponencie, umieszczamy prostokąt. Umieszczając najpierw prostokąt dla ciała komponentu, oszczędzimy sobie późniejszego przenoszenia go za piny, co po prostu zaoszczędzi trochę czasu. Rozmiar prostokąta nie ma znaczenia. Ten, który stworzyłem, będzie zdecydowanie za mały dla końcowego komponentu!

Po prostokącie stworzymy nasz pierwszy pin, który będzie nasionem dla wszystkich pozostałych.

Preferuję ustawić właściwości pinów tak, aby później łatwo się ich używało, więc po prostu ustawiłem numer pinu (oznaczenie) na 1, a nazwę na „P1”. Część numeryczna nazwy może być autoinkrementowana, a litera P pozwala mi w późniejszym kroku wiedzieć, że to jest nazwa pinu.

Teraz powinieneś mieć coś takiego:

Jednak brakuje nam 143 pinów, więc naprawmy to. Najpierw skopiuj pin.

Następnie użyjemy potężnej funkcji Wklej Tablicę z menu Edycja.

Potrzebujemy 143 dodatkowych pinów, więc możesz wpisać 143 dla liczby elementów i upewnij się, że pionowo jest ustawione na -100mil. To wygeneruje piny zaczynając od miejsca, w którym klikniesz, idąc w dół (a nie wysoko).

Ponieważ jest tu dużo pinów, sugerowałbym oddalić obraz i kliknąć gdzieś około 7000mil wysokości na symbolu schematu!

Ułożyłem piny w kolumnach, ale teraz mamy 144 piny do użycia!

Ustawianie Danych Pinów

Posiadanie wszystkich tych pinów nie jest zbyt przydatne dla symbolu, ponieważ musimy jeszcze dodać nazwy do pinów. Aby to zrobić, przejdziemy do karty katalogowej.

Wybieramy tabelę pinów i kopiujemy oraz wklejamy wszystkie dane do dokumentu notepad++. Będzie to wyglądało okropnie, nie martw się!


Jak wspomniałem wcześniej, to nie jest najidealniejsza karta katalogowa, więc zanim będziemy mogli zrobić cokolwiek więcej, chcę trochę oczyścić wklejone dane. Przede wszystkim wiele funkcji zostało podzielonych na kilka linii, w których mają one / lub _ w nazwie. Posiadanie jakościowych danych na nasz punkt wyjścia ułatwi życie później.

Zamierzam użyć Znajdź i Zamień, aby szukać _\r\n i zamienić to na _. Tryb wyszukiwania rozszerzonego znajdzie nazwy, gdzie _ dzieli funkcję na dwie linie, a następnie zastąpi to jednym _. Kliknij Zamień wszystko, aby dokonać wszystkich zmian za jednym razem.


Zrób to samo dla /\r\n, zastępując to /.

Arkusz danych zawiera również wiele kolumn ze słowem „DISABLED”, więc zamierzam znaleźć i zastąpić „DISABLED “ spacją na końcu, a następnie zastąpić to niczym.

Tworzenie tabeli pinów i opisów

Teraz przechodzimy do wyrażeń regularnych, aby uporządkować ten bałagan liter i cyfr w ładną tabelę numerów pinów i opisów. Jedną z rzeczy, które mamy szczęście posiadać, jest pakiet zainteresowania jako pierwsza kolumna w tabeli pinów, co ułatwia korzystanie z wyrażenia regularnego.

Zamierzam użyć strony testowej wyrażeń regularnych na RegexStorm, aby przetworzyć listę pinów. Możesz również sprawdzić ich Referencje Wyrażeń Regularnych, jeśli potrzebujesz odświeżyć swoją składnię.

Dalsze czyszczenie danych

Zanim zaczniemy dopasowywać dane, miło byłoby mieć wszystkie elementy opisu pinów w jednym wierszu, zamiast rozdzielonych na wiele linii, jak to jest obecnie. Możemy użyć prostego wzorca na RegexStorm, aby poprawić tekst, z którym pracujemy.

Wykorzystam wzorzec \r\n(\D), aby znaleźć wszystkie nowe linie, które nie są poprzedzone cyfrą (\D to sekwencja regex oznaczająca 'nie cyfra'). 'Nie cyfra', która została dopasowana, musi znaleźć się w grupie, co jest realizowane przez nawiasy, abyśmy mogli zastąpić dopasowanie samym tym znakiem. Nasze zastąpienie to wtedy $1, ponieważ $1 określa pierwszą dopasowaną grupę.

Po kliknięciu zamień, zakładka kontekstu zawiera poprawione dane wejściowe, więc możemy skopiować je z zakładki kontekstu do danych wejściowych, aby wykonać dalszą pracę.

Jednak to jeszcze nie koniec, jest mnóstwo (127) miejsc, w których Nazwa Pina, Domyślna Funkcja i Funkcja ALT0 są takie same. Nie chcemy tworzyć pinu 5 VDD VDD VDD, prawda? Wystarczy, że pin 5 będzie nazywał się VDD.

Możemy również użyć wyrażenia regularnego, aby posprzątać te zduplikowane nazwy, używając wzorca:
\b([A-Z\d/_]{3,})\s*\1\s*\1? *

To znajdzie granicę słowa za pomocą \b, a następnie dopasuje grupę trzech lub więcej wielkich liter, cyfr (\d), znaków ukośnika lub podkreślenia z ([A-Z\d/_]). Następnie szuka opcjonalnej liczby znaków białych za pomocą \s*, po czym następuje to samo co w pierwszej grupie (\1), kolejna opcjonalna spacja, i w końcu, opcjonalnie (znak ?) pierwsza grupa ponownie, po której następuje dowolna liczba spacji. W ten sposób nie zostaną dopasowane powtórzone piny takie jak EE EE, ale zostaną dopasowane 2-3 takie same rzeczy pod rząd, takie jak VDD VDD VDD.

Możemy wtedy zastąpić to przez ‘$1 ‘, tak samo jak ostatnio, ale ze spacją po $1. W końcu możemy to skopiować z powrotem do pola wejściowego.


Wzorzec wyszukiwania

Szukamy wzorca, który znajdzie to:
115 C7 C6 82 PTC10 ADC1_SE6b
ADC1_SE6b
PTC10 I2C1_SCL FTM3_CH6 I2S0_RX_FS
FB_AD5

Albo

89 F10 D11 — PTB8 PTB8 UART3_RTS_b
FB_AD21

Główna różnica między nimi, o ile nas to dotyczy, polega na obecności znaku ‘—’, gdzie dany pakiet nie posiada pinu.

Moje wyrażenie dopasowujące to:
(?:(?<Pin>\d{1,3})\s+(?:[A-Z\d—]{1,2}\s+){2}(?:[\d—]{1,3}\s+))

To dobrze pasuje w widoku tabeli. Mam teraz tabelę dla pinów, i dopasowałem całą sekcję numerów pinów z danych z karty katalogowej. To oznacza, że wszystko inne będzie opisem.

Co oznacza to wyrażenie?!

Używam wyrażeń regularnych od kiedy programowałem w PERL około 20 lat temu jako nastolatek, więc czuję się z nimi dość komfortowo! Rozbijmy to pierwsze dopasowanie i wyjaśnijmy je, na wypadek gdybyś był nowy w temacie wyrażeń regularnych lub potrzebował odświeżenia.

(?:\b(?<Pin>\d{1,3})\s+(?:[A-Z\d—]{1,3}\s+){2}(?:[\d—]{1,3}\s+))

(?:) oznacza grupę nieprzechwytującą. Pozwala mi to grupować wszystko razem, bez tego, żeby kończyło się to na widoku tabeli w RegexStorm. Grupowanie elementów jest dość ważne, aby uzyskać to, czego chcemy!

\b to granica słowa, np. nowa linia, spacja, tabulator itp. Zapobiega to sytuacjom takim jak:
LPTMR0_ALT1
74 L12 J11 52 

od dopasowania 1 na końcu ALT1, co zapobiega dopasowaniu pierwszych trzech oznaczeń.

(?<Pin>\d{1,3}) przechwytuje grupę nazwaną Pin przez ?<Pin>. Nie wszystkie silniki wyrażeń regularnych obsługują grupy nazwane, co jest jednym z powodów, dla których używam RegexStorm. Ta grupa będzie pasować od 1 do 3 ({1,3}) cyfr (\d). Nasz numer pinu zawsze będzie miał od 1 do 3 cyfr (od 1 do 144), więc to wszystko, czego potrzebujemy szukać.

\s+ Pasuje do dowolnej grupy jednego lub więcej kolejnych znaków białych. W ten sposób, jeśli skopiowane przez nas dane z karty katalogowej mają spację, tabulator lub znak nowej linii między pinami, wszystko zostanie dopasowane, nawet jeśli występują wielokrotne spacje lub tabulatory.

Następnie chcemy dopasować oznaczenia pinów dla obudowy BGA. (?:[A-Z\d—]{1,3}\s+){2} to robi, kwantyfikator na końcu ({2}) mówi, że chcemy dwóch z grupy nieuchwyconej. Ta grupa znajduje od jednego do trzech czegokolwiek w nawiasach kwadratowych. Nawiasy kwadratowe w wyrażeniach regularnych oznaczają dopasowanie "czegokolwiek stąd". W naszym przypadku mamy wszystkie wielkie litery (A-Z), wszystkie liczby (\d), oraz półpauzę używaną w karcie katalogowej, aby powiedzieć, że funkcja nie występuje w tej opcji obudowy. Wreszcie, mamy jedną lub więcej spacji, tak jak po dopasowaniu Pin.

(?:[\d—]{1,3}\s+) pasuje do naszego ostatecznego numeru pinu. To w zasadzie to samo, co nasze dopasowanie pinu, ale musimy również uwzględnić myślnik długi, na wypadek gdyby ta funkcjonalność nie była dostępna w pakiecie.

Jeśli nie masz doświadczenia z wyrażeniami regularnymi, nie martw się, przestaną topić twój mózg, gdy zaczniesz je czytać po zaledwie kilku latach!

Znajdowanie opisu pinu

Aby znaleźć dopasowanie do opisu, możemy dodać do obecnej składni, tak aby wszystko było w jednej grupie, to jest teraz mój wzorzec:
(?:\b(?<Pin>\d{1,3})\s+(?:[A-Z\d—]{1,3}\s+){2}(?:[\d—]{1,3}\s+)(?<Desc>[\w\d_/\s]+?\b(?=\d{1,3}\b)))

Dodany wzorzec do dopasowania tylko części opisowej to:
(?<Desc>[\w\d_/\s]+?\b(?=\d{1,3}\b))

W końcu mamy tabelę zawierającą 144 dopasowania z dość czystymi danymi. Teraz mogę to skopiować i wkleić do mojego arkusza Google.

Ustawianie danych pinu

Powróciwszy do Altium Designer, możemy teraz wprowadzić pewne dane do utworzonej przez nas tablicy pinów. Zaznacz wszystkie piny (ale nie prostokąt) w oknie symbolu schematycznego.

Otwórz panel SCHLIB List, klikając przycisk paneli w prawym dolnym rogu okna Altium.

Teraz zobaczysz wszystkie zaznaczone piny w symbolu schematycznym.

Jeśli klikniesz prawym przyciskiem myszy w dowolnym miejscu siatki, możesz wybrać przełączenie do trybu edycji.

Teraz możesz kliknąć na siatkę i nacisnąć Ctrl-A lub kliknąć prawym przyciskiem myszy i wybrać Zaznacz wszystko.

Po tym skopiuj i wklej wszystko do swojego arkusza kalkulacyjnego nieco niżej niż tabela, którą wkleiłeś z RegexStorm.

Teraz, gdy mamy dwie tabele w arkuszu kalkulacyjnym, możesz skopiować kolumnę z numerami pinów z danych, które skopiowałeś z RegexStorm, na numery pinów z Altium Designer, a następnie zrobić to samo dla kolumny opisu. Ten symbol akurat ma wszystkie piny dla pakietu, nad którym pracujemy, w odpowiedniej kolejności, ale często tak nie będzie. Łatwiej jest po prostu zastąpić obie kolumny, aby uniknąć niezgodności między opisem a nazwą pinu.

Zanim przywrócę te dane do Altium Designer®, chcę szybko poprawić kolumnę z nazwami, zamieniając wszystkie spacje na /, aby dostosować się do standardu mojej biblioteki. Aby to zrobić, zaznacz całą kolumnę w tabeli Altium Designer, a następnie możesz otworzyć narzędzie znajdowania i zamiany, aby wyszukać spację i zamienić ją na ukośnik. Kliknij „zamień wszystko” po sprawdzeniu, czy wyszukiwanie jest ustawione na konkretny zakres zaznaczonych komórek.


Teraz mamy tabelę ze wszystkimi nazwami pinów i oznaczeniami gotowymi do powrotu do Altium Designer. Wystarczy zaznaczyć całą tabelę, a następnie wkleić ją z powrotem do tabeli Listy SCHLIB. Spowoduje to nadpisanie wszystkiego w tabeli, tworząc wielki bałagan w edytorze symboli schematycznych!

Najważniejsze jest to, że mamy dane w Altium Designer, i było to znacznie mniej pracy oraz mniej podatne na błędy niż próba kopiowania wszystkich szczegółów z arkusza danych pin po pinie.

Szybkie grupowanie pinów

Lubię grupować wszystkie piny dookoła arkusza symbolu schematycznego, aby móc zdecydować, czy chcę zachować symbol jako pojedynczą część, czy też potrzebuję stworzyć symbol wieloczęściowy. Dla tej części z 144 pinami, będzie musiała być to część wieloczęściowa, ale nadal wszystko ładnie zgrupuję, aby mieć grupy pinów do kopiowania i wklejania do każdej nowej części.

Możemy użyć panelu Filtr SCHLIB, aby wybrać grupy pinów jednocześnie. Nie ma narzędzia do szybkiego układania pinów razem, ale mając wszystkie piny zaznaczone, łatwo jest przeciągnąć je wszystkie na wolną przestrzeń arkusza schematycznego i sortować je ręcznie.

Aby znaleźć wszystkie piny takie jak VSS lub VSSA, mogę użyć filtra: Nazwa JAK ‘VS*’, który wykona dopasowanie z użyciem symbolu wieloznacznego, aby wybrać wszystkie te piny.

Możesz powtórzyć to z filtrami takimi jak Nazwa JAK ‘VD*’, aby złapać inne piny zasilania. Piny portów na tym komponencie zaczynają się od PTA/PTB/PTC itd., więc możesz użyć tego samego stylu filtra, aby znaleźć wszystkie piny Portu A i tak dalej.

Po krótkim, szybkim układaniu, mam teraz wszystkie moje piny zgrupowane.


Chcę, aby wszystkie piny ADC, DAC, napięcia, masy, USB i kryształu znajdowały się na głównym elemencie, więc przeniosłem je do prostokąta, który utworzyłem jako pierwszy krok tego procesu, a następnie zmieniłem rozmiar prostokąta, aby pasował do wszystkich pinów. Zawsze umieszczam moje piny VDD w lewym górnym rogu, a piny VSS/GND w lewym dolnym rogu i będę grupował piny według funkcji, a nie ich pozycji na symbolu. Uważam, że dzięki temu symbol jest bardziej użyteczny w schemacie niż próba kopiowania fizycznego układu.

Dodawanie części

Teraz, gdy główna część jest zakończona, musimy dodać podczęści do symbolu schematycznego. Nową część do symbolu schematycznego dodajesz, przechodząc do Narzędzia -> Nowa część.

Nowa część pojawi się w panelu Biblioteki SCH, zagnieżdżona pod twoim głównym komponentem.

Po uzyskaniu podczęści, wystarczy utworzyć prostokąt w każdej podczęści, a następnie wyciąć i wkleić do niego piny z głównej części. Podzielenie ogromnego mikrokontrolera na logiczne części pozwoli inżynierowi używającemu symbolu stworzyć czystszy, bardziej uporządkowany schemat niż mając całą kartę zdominowaną przez jeden ogromny symbol schematyczny.

Dalsze opcje czyszczenia

Symbol, który został utworzony powyżej, może być idealny dla twojej biblioteki, ale ja wolę działać z nadmiarem. Przygotowałem kilka dodatkowych wyrażeń regularnych, do których możesz się odwołać, jeśli chcesz dodatkowo oczyścić nazwy lub dodać paski oznaczające aktywny stan niski do funkcji, które zaczynają się od n_ lub kończą na _b, tak jak część, nad którą pracowaliśmy.

Posiadając te wzorce pod ręką, możesz osiągnąć wyższą jakość nazw symboli, tracąc tylko minutę lub dwie na dodatkową pracę. Dodatkowo, możesz użyć ich jako podstawy dla własnych wzorców czyszczenia.

Ręcznie usunąłem zduplikowane funkcje na pinach na powyższych zrzutach ekranu, ale możesz zrobić to automatycznie, jeśli znajdziesz, że masz ich zbyt wiele, aby efektywnie usunąć duplikaty ręcznie.

Najpierw usuń duplikaty początkowej funkcji, takie jak ‘PTA12’. Użyj wyrażenia regularnego:
^([A-Z\d/_]{3,})/(?<inbetween>(?:(?:[^/])+/){1,5})\1/?
Z opcją Opcje -> Wielolinijkowość. Spowoduje to traktowanie każdej linii w polu wejściowym jako oddzielnej jednostki, dla której znak ^ będzie pasował do początku linii.
Zamień dopasowania na:
$1/${inbetween}

Następnie zamień wszystkie funkcje po pierwszej funkcji za pomocą wyrażenia regularnego:
/([A-Z\d/_]{3,})/(?<inbetween>(?:(?:[^/])+/){1,5})\1/?
Możesz wyłączyć opcję wieloliniowości, ale jej pozostawienie włączone nie zapobiegnie działaniu wyrażenia. Ponownie zamień dopasowania na:
/$1/${inbetween}

Zamieniaj dopasowania, dopóki nie znajdziesz więcej. W tej części musiałem uruchomić to 3 razy, aby usunąć wszystkie duplikaty.

Istnieją dwa wyrażenia do zamiany duplikatów, ponieważ wyrażenie musi wiedzieć, od którego miejsca zacząć szukać dopasowania. Nie chcesz zamienić /RMII0_RXER/MII0_RXER/ tylko na /RMII0_RXER/, ponieważ druga funkcja jest taka sama jak pierwsza, z wyjątkiem R. Mając dwie funkcje, możemy użyć / jako znaku początkowego lub początku linii.

Dodawanie aktywnych niskich kresek do nazwy funkcji jest bardziej zgodne ze standardami Altium Designer niż posiadanie n_ lub _b w funkcji. Możesz to zrobić, dodając \ po każdym znaku, a wyrażenie regularne może znaleźć te dla Ciebie za pomocą grup podglądu.

Dla funkcji kończących się na _b, użyj wyrażenia:
([^/](?=[A-Z\d_]*_b[/\r]))
I zamień wszystkie dopasowania na: $1\

Następnie użyj wyrażenia:
\_b
I zamień wszystkie dopasowania na:  \

Dla funkcji zaczynających się od n_, możesz użyć wyrażenia:
((?<=/n_[A-Z\d_]*)[^/])
I zamień wszystkie dopasowania na: $1\

Po tym będziesz musiał wyszukać używając wyrażenia:
n_(\w)
I zamień na: $1
Aby usunąć n_ z początku nazwy funkcji.

Wyrażenia regularne to bardzo potężne narzędzie, jeśli tworzysz symbole w Altium Designer na podstawie arkuszy danych. Możesz dość szybko przekształcić niezrozumiałe kopiowanie i wklejanie z PDF-a na użyteczny arkusz kalkulacyjny, używając tylko kilku wyrażeń. Nowi użytkownicy mówią mi, że składnia wygląda na bardzo zastraszającą, ponieważ na pierwszy rzut oka może wydawać się tylko plątaniną symboli i liczb, ale w rzeczywistości jest to bardzo dobrze zdefiniowana składnia, której nauka jest dość łatwa. Po zaledwie kilku godzinach czyszczenia skopiowanego tekstu z arkusza danych do tabel pinów, zaczniesz czuć się komfortowo ze składnią.

W końcu

Ta konkretna część została wybrana praktycznie losowo, aby stworzyć ten artykuł. Chociaż dane wymagały dużego czyszczenia—i może to zająć więcej czasu niż faktyczne wprowadzenie danych do Altium Designer—mam nadzieję, że pokazało to nowe sposoby pracy z symbolami schematycznymi.

Jeśli masz jakieś sugestie dotyczące szybszego tworzenia symboli schematycznych, zostaw komentarz poniżej ze swoimi propozycjami, aby inni mogli skorzystać z Twojego doświadczenia.

Zobacz więcej poradników Altium lub przeczytaj więcej autorstwa eksperta branżowego Marka Harrisa. Chcesz dowiedzieć się więcej o tym, jak Altium może pomóc Ci w Twoim kolejnym projekcie PCB? Porozmawiaj z ekspertem w Altium.

About Author

About Author

Mark Harris to uznany inżynier z ponad 12-letnim różnorodnym doświadczeniem w branży elektronicznej: od kontraktów lotniczych i wojskowych po niewielkie przedsięwzięcia typu start-up, działania hobbistyczne i wszystko, co znajduje się pomiędzy. Przed przeprowadzką do Wielkiej Brytanii Mark był zatrudniony w jednej z największych organizacji badawczy w Kanadzie; każdy dzień przynosił inny projekt lub wyzwanie na polu elektroniki, mechaniki i oprogramowania. Publikuje również najbardziej obszerną bibliotekę komponentów dla oprogramowania Altium Designer w oparciu o bazę danych typu open source o nazwie Celestial Database Library. Mark ma zamiłowanie do osprzętu i oprogramowania na bazie open source oraz innowacyjnego rozwiązywania problemów, jakie jest niezbędne w obliczu codziennych wyzwań związanych z takimi projektami Elektronika to pasja; obserwowanie rozwoju produktu od idei po realizację i rozpoczęcie interakcji ze światem to niewyczerpane źródło przyjemności.
Z Markiem można się skontaktować bezpośrednio pod adresem: mark@originalcircuit.com

Powiązane zasoby

Powiązana dokumentacja techniczna

Powrót do strony głównej
Thank you, you are now subscribed to updates.