here

‫صورت پروژهٔ پایانی – نسخهٔ ‪۱٫۰‬‬
‫شبیهسازی مدارات منطقی ترکیبی‬
‫توضیحات کلی‬
‫پروژه را میتوانید در تیمهای حداکثر دونفری تهیه کنید‪.‬‬
‫زمان تحویل پروژه تاریخ ‪ ۵ / ۱۵‬خواهد بود‪.‬‬
‫لطفًا توضیحات پروژه را چندین بار بخوانید و در صورت نامفهموم بودن بخشهایی از آن‪ ،‬سئوالت خود را در بخش ‪ discussion‬‬
‫ت درس مطرح کنید‪.‬‬
‫سای ِ‬
‫مقدمه‬
‫در این پروژه قرار است شما برنامهای بنویسید که مدارات منطقی را شبیهسازی کند‪ .‬برنام ٔه شما باید قابلیت خواندن و نمایش‬
‫دادن مدارهای منطقیِ ذخیره شده در فایلهای با قالب ‪ lcx‬را داشته باشد‪ .‬توانایی تغییر فایلهای مورد نظر به صورت گرافیکی و‬
‫دادن ورودی به مدار و گرفتن خروجی از دیگر قابلیتهای برنامهٔ شماست‪.‬‬
‫هر مدار منطقی به صورت یک ماژول در یک فایل ذخیره میشود که ممکن است از ماژولهای دیگر (فایلهای دیگر) در ساختار‬
‫خود استفاده کند‪.‬‬
‫هر ماژول تعداد مشخصی ورودی دارد و تعدادی خروجی که خروجیها به طور یکتا براساس ورودیها تعیین میشوند‪ .‬چون در این‬
‫پروژه تنها شبیهسازی مدارات ترکیبی مورد نظر است‪ ،‬در سیمکشی مدارات دور وجود ندارد و مفهوم زمان وارد مدار نمیشود‪.‬‬
‫قالب فایها با پسوند ( ‪)lcx‬‬
‫قالب فایلهایی که میخوانید و ذخیره میکنید به صورت سختگیرانه باید از قواعد زیر پیروی کند‪ .‬چون بخشی از نمرٔه شما به‬
‫تستهای کامپیوتری اختصاص دارد‪ ،‬اگر از این قالب دقیقاً پیروی نکنید‪ ،‬بخش زیادی از نمره را از دست خواهید داد‪.‬‬
‫●‬
‫فایلهای ‪ lcx‬نوعی فایل متنی هستند که در آنها حرف‪ ،‬عدد و علمت نوشته شده است‪( .‬با رمزگذاری ‪)ascii‬‬
‫●‬
‫در هر فایل دقیقًا یک ماژول ذخیره میشود‪ .‬هر فایل علوه بر مشخصات ساختاری مدار (چگونه وصل شدن زیرماژولها‬
‫به هم) اطلعات مورد نیاز برای رسم دقیق خود بر روی صفحه را نیز داراست‪.‬‬
‫●‬
‫ل فایل ‪ And.lcx‬مربوط به ماژول ‪ And‬است‪ .‬حرف اوّل ماژولها بزرگ و‬
‫نام ماژول از روی نام فایل تعیین میشود‪ .‬مث ً‬
‫بقیه حرفها کوچک هستند‪ .‬نام ماژول چیزی است که برای ارجاع دادن به یک ماژول استفاده میشود‪.‬‬
‫●‬
‫دو نوع ماژول و بنابراین دو نوع فایل وجود دارد‪ -۱ :‬ماژولهای اتمی(تجزیه ناپذیر) و ‪ -۲‬ماژولهای مرکب‪ .‬برای‬
‫ماژولهای اتمی‪ ،‬دقیقًا جدول خروجی براساس انواع ورودی در فایل ‪ lcx‬نوشته شده است و برای ماژولهای مرکب‪،‬‬
‫اطلعات چگونگی ترکیب ماژولهای دیگر و قرار گرفتن آنها کنار هم آمده است‬
‫در اینجا وقتی از مختصات صحبت میکنیم‪ ،‬مبدأ مختصات در گوش ٔه بال و سمت چپ قرار دارد و (‪ )width, height‬نقطهٔ پایین‬
‫و سمت راست را نشان میدهد‪ .‬واحدها نیز همه نقطه (‪ )pixel‬هستند‪.‬‬
‫در سطر اول فایل ابتدا عرض (‪ )width‬و سپس طول (‪ )height‬ماژول آمده است‪ .‬هر ماژول یک مستطیل با این ابعاد را اشغال‬
‫میکند‪.‬‬
‫از سطر دوم توضیحات مربوط به ورودیها و خروجیها شروع میشود‪ .‬در یک خط جدا گانه نوشته شده ‪ IO‬و در خط بعد ‪ ،N‬تعداد‬
‫ورودیها آمده است‪ .‬در ‪ N‬خط بعد در هر خط ابتدا ‪ Xi‬و سپس ‪ Yi‬مربوط به ورودی ‪i‬ام قرار دارد‪ .‬ورودیها و خروجیها حتمًا باید‬
‫ل با مختصات (‪ )x,0‬یا (‪ ... )width, x‬ورودی ‪i‬ام را با ‪ Ii‬نمایش‬
‫روی لبههای خارجی مستطیلِ ماژول قرار داشته باشند‪ .‬مث ً‬
‫میدهیم و در بقیهٔ فایل با این برچسب از آن استفاده میکنیم‪ .‬به این ترتیب ورودیها عبارت اند از ‪ .I0 I1 ....IN­1‬در خط بعد‬
‫‪ M‬تعداد خروجیها آمده و سپس در ‪ M‬سطر مختصات خروجیها که آنها را با برچسبهای ‪ O0 – O1 .... IM­1‬نشان میدهیم‪.‬‬
‫‪AND.lcx‬‬
‫‪200 100‬‬
‫‪IO‬‬
‫‪2‬‬
‫‪0 30‬‬
‫)‪(I0‬‬
‫‪0 70‬‬
‫)‪(I1‬‬
‫‪1‬‬
‫‪200 50‬‬
‫)‪(O0‬‬
‫‪N‬‬
‫حال در صورتی که فایل مربوط به یک ماژول اتمی باشد در یک سطر نوشته شده ‪ Table‬و در ‪ ۲‬سطر در هر سطر ‪ N+M‬‬
‫صفر و یک آمده که ‪ N‬تای اول نمایندهٔ یک مقداردهی به ورودیها و ‪ M‬تای دوم خروجیهای مربوط به آن ورودیها را مشخص‬
‫میکند‪ .‬بدیهی است تمام ‪ ۲ N‬حالت ممکن در فایل وجود دارند‪ .‬فایل مربوط به ماژول اتمی در همین جا به پایان میرسد‪.‬‬
‫‪Table‬‬
‫‪0 0 0‬‬
‫‪0 1 0‬‬
‫‪1 0 0‬‬
‫‪1 1 1‬‬
‫اگر ماژول مورد نظر مرکب باشد‪ ،‬در یک سطر نوشته شده ‪ Modules‬و در سطر بعد ‪ X‬که تعداد ماژولهاست آمده است‪ .‬در ‪ X‬‬
‫خط بعدی در هر خط مشخصات یک زیرماژول آمده است‪ .‬در خط ‪i‬ام مشخصات زیرماژول ‪i‬ام که با ‪ Mi‬برچسب گذاری‬
‫ل این‬
‫میشود‪ .‬در این خط ابتدا نام ماژول (نوع آن) و سپس به ترتیب ‪ X1 Y1 X2 Y2‬آمده است که محل قرار گرفتن مستطی ِ‬
‫زیرماژول را نشان میدهد‪ .‬گوشهٔ سمت چپ بال در (‪ )X1,Y1‬و گوشهٔ پایین سمت راستش در (‪ .)X2,Y2‬بدیهی است ماژول‬
‫مورد نظر باید از نظر عرضی‪ ،‬طولی یا هر دو مقداری تغییر اندازه دهد و براساس این اندازههای جدید محل جدیدی برای ورودی‬
‫و خروجیهای آن به دست میآیند‪ .‬برای نوشت ورودی دوم از ماژول صفر از نماد روبرو ‪ M0:I2‬و برای خروجی اول ماژول سوم‬
‫از نماد ‪ M3:O1‬استفاده میکنیم‪ .‬بنابراین در این ‪ X‬خط مشخصات ‪ M0 M1 ... MX­1‬آمده است‪ .‬در نمایش گرافیکی باید‬
‫مستطیل ماژول را در محل مشخص شده رسم کنید‪ ،‬نام آن را درون مستطیلش بنویسید و ورودیها و خروجیهای آن را طوری‬
‫مشخص کنید که محل آنها دیده شوند‪.‬‬
‫‪Modules‬‬
‫‪2‬‬
‫‪AND 3 3 10 10‬‬
‫)‪(M0‬‬
‫‪OR 3 12 10 19‬‬
‫)‪(M1‬‬
‫در بخش پایانی یک فایل ماژول مرکب‪ ،‬در یک خط نوشته شده ‪ Wires‬و در خط بعد عدد ‪( W‬تعداد سیمها) آمده است‪ .‬سپس‬
‫در ‪ W‬سطر در هر سطر دو برچسب مربوط به ورودی‪/‬خروجی‪/‬ورودی یا خروجی یک زیرماژول آمده است که مشخص میکند‬
‫سیگنال خروجی اولی به دومی وارد میشود‪ .‬شما در نمایش گرافیکی صرفاً باید با یک خط مستقیم نقاط متناظر برچسبها را به هم‬
‫متصل کنید‪.‬‬
‫‪Wires‬‬
‫‪5‬‬
‫‪I0 M0:I0‬‬
‫‪I1 M0:I1‬‬
‫‪M0:O0 M1:I0‬‬
‫‪I2 M1:I1‬‬
‫‪M1:O0 O0‬‬
‫واسط گرافیکی‬
‫باید یک واسط گرافیکی با قابلیتهای زیر طراحی کنید‪.‬‬
‫●‬
‫خواندن فایلهای با قابلیت ذکر شده‪ ،‬تشخیص خطا در آنها و یا نمایش گرافیکی آنها‬
‫●‬
‫نمایش برچسب هر یک از زیرماژولها و برچسبهای ورودی‪/‬خروجی‪ /‬ورودی و خروجی زیرماژول‬
‫●‬
‫توانایی جابجا کردن زیرماژولها و محل ورودی و خروجی ماژول‬
‫●‬
‫تغییر دادن اندازٔه یک زیر ماژول‬
‫●‬
‫تغییر اندازهٔ کل ماژول و به همان نسبت تغییر اندازٔه زیرماژولها‬
‫●‬
‫ساختن یک ماژول جدید و استفاده از ماژولهای دیگر در آن و یا پر کردن جدول درستی برای ماژولهای اتمی‪.‬‬
‫بدیهی است باید بتوانیم از یک یک ورودی یا خروجی را انتخاب کنیم و با سیم به یک ورودی یا خروجی دیگر‬
‫متصل کنیم‪ .‬دقت کنید که سیمها جهتدار هستند‪.‬‬
‫●‬
‫حذف یک زیرماژول و در پی آن حذف شدن سیمهای متصل به آن ماژول‪ .‬شمارهٔ ماژولهای بعدی ماژول حذف‬
‫شده باید کم شوند‪.‬‬
‫●‬
‫ذخیره کردن تغییرات بال در فرمت ‪lcx‬‬
‫●‬
‫توانایی دادن ورودی عددی به ماژول و محاسب ٔه خروجیهای آن‬
‫واسط خط فرمان‬
‫‪۱‬‬
‫شما باید کلسی با نام ‪ TestModule‬در پکیج دیفالت برنامهتان قرار دهید متود استاتیک ‪ main‬داشته باشد و به عنوان‬
‫آرگومان اول پوشهٔ ماژولها و زیرماژولها و به عنوان آرگومان دوم نام فایل تست را بگیرد‪ .‬این کلس باید نتیج ٔه پردازش ماژول‬
‫مورد نظر را (که در پوشهای که به عنوان آرگومان اول پاس داده شده است‪ ،‬قرار دارد) در فایل »‪ «TestModule.txt‬ذخیره‬
‫کند‪ .‬در فایل تست نیز که به عنوان آرگومان دوم پاس داده میشود‪ ،‬ابتدا نام ماژولی که باید تست شود و سپس در هر خط یک‬
‫صفر یا یک آمده که عدد خط ‪i‬ام به معنی نسبت داده شدن آن عدد به ورودی ‪i‬ام ماژول مورد نظر است‪ .‬در فایل خروجی (‬
‫‪ )TestModule.txt‬یا بنویسید »‪ «Problem occured‬به معنی اینکه فایل ماژول یا فایلهای زیرماژول مشکل دارند و یا به‬
‫تعداد خروجیهای ماژول مورد تست در هر خط یک صفر یا یک که نمایندٔه خروجی ‪i‬ام ماژول مورد نظر خواهد بود‪.‬‬
‫‪Command line ۱‬‬
‫توجه‬
‫شاید بهتر باشد ابتدا واسط خطفرمان که سادهتر و به نوعی پیشنیاز دیگری است را پیادهسازی کنید و وقتی مطمئن شدید که‬
‫برنامهتان در این قسمت درست کار میکند‪ ،‬به سراغ قسمت دیگر روید‪.‬‬
‫به زودی تستهایی در سایت درس قرار میگیرد که حتماً برنامهتان را با آنها تست کنید تا در قالب فایلهای ‪ lcx‬تفاوتی نداشته‬
‫باشیم‪.‬‬