V2CC.LIBS(5) File Formats V2CC.LIBS(5)

v2cc.libs - پرونده نگاشت کتابخانه VHDL برای کامپایلر/شبیه‌ساز FreeHDL

FreeHDL یک مجموعه کامپایلر/شبیه‌ساز برای زبان توصیف سخت‌افزار VHDL است. استانداردهای VHDL'93 و همچنین VHDL'87 پشتیبانی می‌شوند.

FreeHDL پرونده‌های منبع اصلی VHDL را به ++C ترجمه می‌کند. سپس، منبع ++C می‌تواند کامپایل شده و به هسته پیوند داده شود تا برنامه شبیه‌سازی ساخته شود. اجرای فایل اجرایی تولیدشده، مدل VHDL مربوطه را شبیه‌سازی خواهد کرد. فرآیند ساخت واقعی برای تولید شبیه‌ساز از منبع VHDL، یک فرآیند پیچیده است که توسط اسکریپت gvhdl مدیریت می‌شود.

برنامه FreeHDL مفهوم بسته‌ای از کتابخانه‌های طراحی ندارد. پرونده‌های VHDL برخلاف سایر سیستم‌های کامپایلر/شبیه‌ساز VHDL، از پیش تجزیه و تحلیل نشده و در پایگاه‌داده کتابخانه ذخیره نمی‌شوند. در عوض، هر زمان که نیاز به ارجاع به یک واحد طراحی باشد، FreeHDL کد VHDL آن واحد طراحی را از نو تجزیه می‌کند. بنابراین، باید بتواند با داشتن نام VHDL یک واحد طراحی، پرونده منبع آن را پیدا کند.

از این رو، تا آنجا که به FreeHDL مربوط می‌شود، یک کتابخانه طراحی در واقع یک نگاشت از شناسه‌های VHDL به نام پرونده‌ها است. همچنین نگاشتی برای دریافت نام کتابخانه‌ها از پرونده‌های نگاشت وجود دارد.

چنین نگاشتی از طریق یک «پرونده نگاشت» (mapping file) مشخص می‌شود. این پرونده شامل فهرستی از قواعد الگو است که هر کدام رده خاصی از شناسه‌ها را به نام پرونده‌ها تبدیل می‌کنند.

نحو (syntax) یک پرونده نگاشت به شرح زیر است:

Lexical:
   litchar: 'a'..'z' | 'A'..'Z' | '0'..'9' | '_' | '/' | '-' | '.' escchar
   escchar: '\' char
   whitespace: ' ' | '\n' | '\v' | '\t' | comment
   comment: '#' any_character* '\n'
   opchar: ':' | ',' | '(' | ')'
   specchar: every printable char except litchar, whitespace and opchar
   symchar: litchar | specchar
   symbol: symchar+
Grammar:
   mapping: version patternrule*
   version: "v2cc_mapfile" "0"
   patternrule: symbol [ ':' symbol ]

توضیحات (کامنت‌ها) نادیده گرفته می‌شوند.

یک پرونده نگاشت، توالی‌ای از قواعد الگو را مشخص می‌کند. هنگام تبدیل یک شناسه، هر قاعده به نوبت بررسی شده و نخستین قاعده‌ای که مطابقت داشته باشد انتخاب می‌شود.

یک قاعده به شکل زیر است:

pattern: filename

هنگامی که بخش : filename حذف شود، مقدار پیش‌فرض آن patternEXT خواهد بود که در آن EXT توسط کاربر پرونده نگاشت تعیین می‌شود.

بخش «الگو» (pattern) می‌تواند شامل نویسه ویژه «<» باشد که یک «کاراکتر عمومی» (wildcard) را معرفی می‌کند. نویسه «<» باید با یک «>» دنبال شود که نویسه‌های دلخواهی میان آن‌ها قرار دارند. این نویسه‌ها نام کاراکتر عمومی را تشکیل می‌دهند. یک کاراکتر عمومی با هر توالی از نویسه‌ها مطابقت می‌یابد. هر تعداد کاراکتر عمومی می‌تواند در الگو وجود داشته باشد، اما هر یک باید نامی یکتا داشته باشند.

بخش «نام پرونده» (filename) نیز می‌تواند شامل نویسه «<» و در ادامه یک نام و سپس «>» باشد. در این بخش، یک «جایگزینی کاراکتر عمومی» (wildcard substitution) معرفی می‌شود. این مقدار با نویسه‌هایی جایگزین می‌شود که با کاراکتر عمومی هم‌نام در pattern مطابقت یافته‌اند. هنگامی که هیچ کاراکتر عمومی با نام مناسب در pattern وجود نداشته باشد، با هیچ جایگزین می‌شود (رشته خالی). در حین انجام این جایگزینی، نویسه‌های «#» و «/» به ترتیب با «##» و «#-» جایگزین می‌شوند. هیچ تبدیل نویسه‌ای دیگری انجام نمی‌شود، بنابراین اگر نویسه‌های نامتعارفی در شناسه‌های VHDL خود داشته باشید، همان نویسه‌های نامتعارف را در نام پرونده‌های خود نیز خواهید داشت.

پیش از انجام مقایسه با الگوها، شناسه VHDL به شکل متعارف (canonical) درمی‌آید: زمانی که یک شناسه انتزاعی نباشد، تمام نویسه‌های آن به حروف کوچک تبدیل می‌شوند.

هنگامی که نام پرونده حاصل نسبی باشد (با «/» شروع نشود)، مسیر دایرکتوری پرونده نگاشت به عنوان پیشوند به آن افزوده می‌شود.

یک پرونده نگاشت ناموجود معادل قاعده تکی زیر است:

<>

یک پرونده نگاشت خالی نیز دقیقاً همان است: یک نگاشت خالی.

نیازی نیست که نگاشت برگشت‌پذیر باشد. نگاشت چند شناسه مختلف به یک نام پرونده واحد کاملاً مجاز است.

هیچ نویسه ویژه‌ای به جز «<» و «>» در pattern یا filename معتبر نیست. این نویسه‌ها برای توسعه‌های آینده رزرو شده‌اند.

پرونده‌های نگاشت برای تبدیل نام واحدهای طراحی به نام پرونده‌ها با بررسی دایرکتوری‌های مشخص‌شده توسط «مسیر کتابخانه v2cc» پیدا می‌شوند. می‌توانید از متغیر محیطی V2CC_LIBRARY_PATH و گزینه‌های خط فرمان برای تعریف این مسیر استفاده کنید. هنگامی که این متغیر محیطی تنظیم نشده باشد، مقدار پیش‌فرضی به آن اختصاص می‌یابد که کتابخانه‌های استانداردی را که همراه با خود v2cc توزیع و نصب شده‌اند در دسترس قرار می‌دهد. هنگامی که تنظیم شود، این مقدار پیش‌فرض را به طور کامل بازنویسی می‌کند.

متغیر V2CC_LIBRARY_PATH از نام پرونده‌هایی تشکیل شده است که با علامت «:» از یکدیگر جدا شده‌اند. نام پرونده «*» با مقدار پیش‌فرض ذکرشده در بالا جایگزین می‌شود.

علاوه بر متغیر محیطی، می‌توانید از گزینه خط فرمان -L libdir با v2cc استفاده کنید. دایرکتوری‌های مشخص‌شده با -L به ابتدای موارد مشخص‌شده توسط V2CC_LIBRARY_PATH افزوده می‌شوند. در مسیر نهایی کتابخانه، آن‌ها با همان ترتیبی که در خط فرمان ذکر شده‌اند ظاهر می‌شوند.

جستجو برای یک واحد طراحی با نام UNIT در کتابخانه‌ای با نام LIB به شیوه زیر انجام می‌شود:

for each component of the library path, L
  if L is a regular file
    set LMAP to L
  else if L is a directory
    set LMAP to L/v2cc.libs
  else
    continue with next component
  translate LIB into FLIB using LMAP with EXT=""
  if FLIB.vhdl exists
    terminate with FLIB.vhdl as the result
  if FLIB.v2cc exists
    set UMAP to FLIB.v2cc
  else if FLIB is a directory
    set UMAP to FLIB/v2cc.units
  else
    continue with next component
  translate UNIT into FUNIT using UMAP with EXT=".vhdl"
  terminate with FUNIT as the result
terminate unsuccessfully

این سازوکار برای تمامی واحدهای طراحی که از درون کد VHDL (یا به روش‌های دیگر) به آن‌ها ارجاع داده شده استفاده می‌شود. با این حال، در مورد معماری‌ها (architectures) و بدنه بسته‌ها (package bodies) پیچیدگی وجود دارد، زیرا آن‌ها به طور یکتا با یک شناسه تکی مشخص نمی‌شوند. برای آن‌ها یک شناسه مصنوعی ساخته می‌شود. معماری‌ها نام‌هایی به شکل زیر دریافت می‌کنند:

<entity>(<architecture>)

در حالی که بدنه بسته‌ها به شکل زیر درمی‌آیند:

<package>(body)

برای نمونه، عبارت «architecture struct of model» به «model(struct)» و عبارت «package body misc» به «misc(body)» تبدیل می‌شود.

هنگامی که یک پرونده طراحی شامل چندین واحد طراحی باشد، همگی تجزیه شده، از نظر درستی بررسی شده و به خاطر سپرده می‌شوند، اما تنها واحد مورد نیاز برای تولید کد استفاده خواهد شد. به این معنا که اگر یک پرونده طراحی شامل هر دو مورد سرآیند بسته و بدنه بسته باشد و از واحد طراحی دیگری به سرآیند بسته ارجاع داده شود، هیچ کدی برای بدنه بسته تولید نخواهد شد. هرگاه یکی از واحدهای نادیده گرفته‌شده بعداً در همان اجرای v2cc مورد ارجاع قرار گیرد، پرونده طراحی دوباره خوانده نخواهد شد زیرا تمامی واحدهای طراحی در حافظه نگهداری می‌شوند.

ساده‌ترین حالت زمانی است که هیچ پرونده نگاشتی ندارید. در این صورت، یک کتابخانه طراحی در واقع یک دایرکتوری در مسیر کتابخانه شما است. نام آن دایرکتوری همان نام کتابخانه در VHDL است. هر پرونده در آن دایرکتوری با پسوند «‎.vhdl» برای یک واحد طراحی با همان نام پرونده (بدون پسوند) استفاده می‌شود.

فرض کنید این ساختار دایرکتوری را دارید:

somedir/
  std/
    standard.vhdl
    textio.vhdl
  ieee/
    numeric_bit.vhdl
    std_logic_1164.vhdl

هنگامی که «somedir» را در مسیر کتابخانه خود قرار می‌دهید، به واحدهای طراحی زیر دسترسی خواهید داشت:

STD.STANDARD
STD.TEXTIO
IEEE.NUMERIC_BIT
IEEE.STD_LOGIC_1164

در این وضعیت، برای هر واحد طراحی یک پرونده دارید. هنگامی که برای هر کتابخانه طراحی یک پرونده داشته باشید، ساختار به شکل زیر خواهد بود:

somedir/
  fmf.vhdl

تمام ارجاعات به واحدهای طراحی در کتابخانه طراحی FMF به «fmf.vhdl» هدایت خواهند شد.

به عنوان مثالی دیگر، فرض کنید تمام کتابخانه‌های VHDL در زیرشاخه‌هایی با شروع از دایرکتوری ریشه «/foo» نگاشت شده‌اند. افزون بر این، فرض کنید کتابخانه‌های VHDL با نام‌های «lib1» و «lib2» وجود دارند. آن‌ها باید به زیرشاخه‌های «/foo/lib1_dir» و «/foo/lib2_dir» نگاشت شوند. از این رو، ساختار پرونده/دایرکتوری به صورت زیر است:

/foo                     <-  دایرکتوری ریشه کتابخانه
/foo/v2cc.libs           <-  پرونده کنترل نگاشت
/foo/lib1_dir            <-  دایرکتوری برای کتابخانه VHDL با نام lib1
/foo/lib1_dir/comp1.vhdl <-  پرونده شامل مدل VHDL با نام comp1
/foo/lib2_dir            <-  دایرکتوری برای کتابخانه VHDL با نام lib2
/foo/lib2_dir/comp2.vhdl <-  پرونده شامل مدل VHDL با نام comp2

سپس، پرونده «/foo/v2cc.libs» باید شامل موارد زیر باشد:

v2cc_mapfile 0
lib1 : lib1_dir
lib2 : lib2_dir

برای کامپایل یک طراحی به نام comp1 (ذخیره‌شده در پرونده comp1.vhdl) در کتابخانه VHDL با نام lib1، به زیرشاخه «/foo/lib1_dir» بروید و دستور زیر را اجرا کنید:

gvhdl -c -L .. -l lib1 comp1.vhdl

توجه داشته باشید که گزینه -l lib1 کامپایلر را وادار می‌کند تا مدل ذخیره‌شده در «comp1.vhdl» را با کتابخانه VHDL با نام lib1 مرتبط سازد. همچنین توجه داشته باشید که سوییچ کامپایلر -L .. مسیر دایرکتوری محل ذخیره «v2cc.libs» را مشخص می‌کند. همچنین می‌توانید یک مسیر مطلق مشخص کنید:

gvhdl -c -L /foo -l lib1 comp1.vhdl

توجه داشته باشید که comp1 باید در پرونده‌ای به نام «comp1.vhdl» قرار داشته باشد.

اگر lib2 شامل طراحی comp2 باشد که از comp1 موجود در lib1 استفاده می‌کند، به «/foo/lib2_dir» بروید و دستور زیر را برای ایجاد فایل اجرایی مدل comp2 اجرا کنید:

gvhdl -L .. -l lib2 comp2.vhdl ../lib1_dir/comp1.o

gvhdl(1), freehdl-v2cc(1), freehdl-config(1)

همیشه می‌توان آخرین نسخه FreeHDL را از نشانی زیر دریافت کرد:

www.freehdl.seul.org

باگ‌های شناخته‌شده در پرونده BUGS مستند شده‌اند. اگر گزارش شما مربوط به موضوعات تجزیه‌کننده (parser) است، با Marius Vollmer به نشانی <mvo@zagadka.ping.de> تماس بگیرید. اگر به تولیدکننده کد یا کامپایلر مربوط است، یک رایانامه به Edwin Naroska به نشانی <edwin@ds.e-technik.uni-dortmund.de> ارسال کنید. اگر مطمئن نیستید، آن را برای Edwin بفرستید؛ او گزارش شما را به دریافت‌کننده مناسب ارجاع خواهد داد.

Edwin Naroska © 1999, 2000, 2001, 2002, 2003, 2004, 2005 <edwin@ds.e-technik.uni-dortmund.de>

این یک نرم‌افزار آزاد است؛ برای شرایط رونوشت‌برداری به کد منبع مراجعه کنید. هیچ ضمانتی وجود ندارد؛ حتی برای قابلیت فروش یا تناسب با یک هدف خاص.

نوشته‌شده توسط Marius Vollmer <mvo@zagadka.ping.de> و Edwin Naroska <edwin@ds.e-technik.uni-dortmund.de>.

December 2005 Debian/GNU Linux