Разработка программного обеспечения - таймера

Обзор современных методов проектирования большой интегральной схемы, маршрут ее проектирования на основе базового матричного кристалла. Разработка алгоритма и его программная реализации, анализ его достоинств и недостатков. Разработка топологии таймера.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 03.10.2017
Размер файла 277,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Ээвм2 = 4 10 000 = 40 000 (руб)

3. Расчет заработной платы исследователей-разработчиков до внедрения ПП.

Ззп1 = [ Ц No (1 + Кп) ] (1 + Кдз) (1 + Ксн)

Ззп1 = [ 640 000 0.2 (1 + 0.2) ] (1 + 0.2) (1 + 0.39) =

= 256 204 (руб)

4. Расчет заработной платы исследователей-разработчиков после внедрения ПП.

Ззп2 = [ Ц N1 (1 + Кп) ] (1 + Кдз) (1 + Ксн)

Ззп2 = [ 640 000 0.1 (1 + 0.2) ] (1 + 0.2) (1 + 0.39) =

= 128 102 (руб)

5. Расчет экономии затрат на основной и дополнительной заработной плате разработчиков за счет сокращения трудоемкости получения технического решения.

Э1 = Ззп1 - Ззп2

Э1 = 256 204 - 128 102 = 128 102 (руб)

Расчет годовой экономии от внедрения системы.

Эг = ( Э1 - Ээвм2 + Ээвм1 ) N

Эг = ( 128 100 - 40 000 + 160 000 ) 40 = 9 924 000 (руб)

7. Расчет окупаемости:

Ток = Кдоп / Эг

Ток = 5 068 000 / 9 924 000 = 0.51

8. Расчет годового экономического эффекта от внедрения ПП.

Э = Эг - Ен Кдоп

Э = 9 924 000 - 0.2 5 068 000 = 8 910 400 (руб)

Основные выводы

Годовой экономический эффект от внедрения системы автоматического размещения элементов топологии матричных БИС составляет 9 000 000 руб .

Окупаемость системы составит 0.51.

Основными источниками экономии для организаций, использующих подобные программные средства, являются:

- увеличение объемов и сокращение сроков переработки информации;

- сокращение расхода машинного времени и других ресурсов на отладку и сдачу задач на эксплуатацию;

- повышение коэффициента использования вычислительных ресурсов, средств подготовки и передачи информации;

- повышение производительности труда эксплуатирующих ВТ специалистов.

6.Эргономические аспекты труда при работе на ПЭВМ

Особенности работы с компьютером

Работая за дисплеем компьютера человек подвергается воздействию различных факторов. К таким воздействиям можно отнести следующие:

тепловое излучение;

электромагнитное излучение;

недостаток или избыток общей освещенности;

механическое воздействие;

шумовое воздействие;

опасность поражения электрическим током.

Наличие подобных факторов обусловлено предметами и средствами труда программиста, к которым можно отнести следующее оборудование:

системная часть компьютера;

дисплей;

клавиатура;

принтер;

другие внешние устройства.

Особенно сильно проявляется влияние дисплея компьютера. Дисплей принадлежит к числу тех компонентов, работа с которыми требует особенного внимания. Практически большую часть времени работы за компьютером человек смотрит на экран, или , по крайней мере, находится перед ним, подвергаясь таким образом воздействию электромагнитного излучения, а так как качество электронных лучевых трубок ( ЭЛТ ) еще не всегда удовлетворительное, то вопросам организации рабочего места следует уделить первостепенное внимание.

Ряд исследований выявили связь между работой на компьютере и такими недомоганиями, как боли в спине и шее, запястный синдром, стенокардия и стрессы. К другим обнаруженным при опросах жалобам на здоровье относятся "пелена перед глазами", сыпь на лице, хронические головные боли, сильная возбудимость, быстрая утомляемость, невозможность долго концентрировать внимание, снижение трудоспособности и нарушение сна.

Поэтому для сохранения здоровья пользователя и повышения его работоспособности все более важное значение приобретают вопросы эргономики.

К вопросам эргономики при создании комфортных и безопасных условий труда относятся такие важнейшие вопросы организации производства как макроклиматические условия, освещенность, требования к внутренней отделке помещений, чистоте воздуха и акустике помещений.

Болезни связанные с работой на компьютере

Из всех болезней связанных с работой на компьютере наибольшее внимание привлекают заболевания рук, спины, плеч, шеи, которые связаны с использованием клавиатуры. Этот набор болезней имеет общее название - синдром длительных статических нагрузок ( СДСН ). Специалисты по эргономике считают, что одна из причин появления СДСН состоит в том, что, работая за клавиатурой, пользователи компьютеров с высокой скоростью повторяют одни и те же движения. Поскольку каждое нажатие на клавиатуру сопряжено с сокращением мышц, сухожилия непрерывно скользят вдоль костей и соприкасаются с тканями, вследствие чего могут развиваться болезненные воспалительные процессы. Некоторые заболевания связанные со статическими нагрузками являются следствием неправильной конструкции клавиатуры. Это объясняется тем, что усилия, необходимые для того чтобы руки при печати находились параллельно клавиатуре, вызывают постоянные перегрузки мышц и сухожилий. Многие виды СДСН можно предотвратить, применяя "переламываемую" клавиатуру, при использовании которой ладони во время работы обращены друг к другу. Благодаря такой конструкции заметно уменьшается нагрузка, приходящаяся на верхнюю часть тела.

У пользователей компьютеров СДСН может развиваться в плече и в руке, когда им приходится долго и интенсивно манипулировать "мышью"; большим нагрузкам подвергается при этом и область прикрепления мышцы к локтю.

Однако не только кисти, локти и плечи представляют собой "опасные зоны". Другой причиной возникновения СДСН может быть длительное пребывание в сидячем положении при работе с терминалом, которое приводит к сильному перенапряжению мышц спины и ног. Поскольку мышцы не расслабляются, в них ухудшается кровообращение. Питательные вещества, переносимые кровью, поступают в мышцы недостаточно быстро, зато в мышечных тканях накапливаются продукты распада (например, молочная кислота), в результате чего у программиста могут возникнуть болезненные ощущения.

Для снижения вероятности возникновения выше перечисленных заболеваний нужно проводить соответствующую организацию рабочего места.

Организация рабочего места пользователя ЭВМ

В процессе труда на человека действует не только непосредственно производственный процесс, но и условия в которых он протекает. Это воздействие сказывается на всем организме работника: на нервно мышечном аппарате, центральной нервной системе, анализаторах, органах дыхания, кровообращения, пищеварения, на работе мозга и т.д.

Воздействие на человека производственного процесса в котором он участвует, зависит от следующих факторов:

- условий окружающей среды;

- интенсивности труда;

- безопасности труда.

Интенсивность труда

Интенсивность труда - -это мера затраты человеком физической и умственной энергии за единицу времени. При выполнении одной и той же работы одним и тем же человеком, затраты энергии зависят от условий, в которых происходит производственный процесс. Наибольшая работоспособность проявляется у человека в комфортных для него условиях. Санитарными нормами СН-245-71 установлены оптимальные величины параметров внешней среды для комфортных условий и предельно допустимые для некомфортной зоны. Условия труда зависят от его безопасности(производственного процесса).

Человек обладает в большинстве случаев, способностью эффективно обрабатывать информацию и принимать по ней решения. Он координирует работу всех элементов системы, может наблюдать и контролировать работу ЭВМ, устройства и системы управления в целом с помощью осведомительной информации.

Возможности человека по приему и переработке информации зависят от его пропускной способности, т.е. от оптимального и предельно допустимого количества информации, которое может быть принято человеком, от распределения данной информации по времени. Пропускная способность человека различна про операциях приема, передачи и обработке информации.

При опознавании буквенных и цифровых знаков в процессе кратковременного приема, пропускная способность человека находится в пределах 30-60 бит/сек.

Сопоставляя работоспособность человека как при перегрузке, так и при недогрузке информацией, следует определять оптимальную скорость передачи информации человеку. Обеспечение такого оптимума является важнейшим условием сохранением устойчивой работы.

Учет требований охраны труда при организации трудового процесса

Трудовой процесс человека сопровождается утомлением. Утомление - естественное явление. Вредным является последовательное развитие и углубление утомления. Если утомление настолько велико, что не успевает исчезнуть в течении свободной от работы части времени и работа возобновляется с пониженной работоспособностью, то такое состояние называется переутомлением.

С точки зрения охраны труда необходимо избежать или как можно дальше отодвинуть момент наступления крайних форм утомления. Утомление, возникающее во время работы, можно уменьшить следующим путем:

- чередование труда и отдыха, активного и пассивного;

- периодическое переключение производственного процесса с умственной работы на физическую и наоборот;

- регулировка и поддержание определенного ритма и темпа работы;

- устранение или минимизация монотонности производственного процесса;

- автоматизация операций;

- поддержание максимальной комфортности рабочего места и др.

Перед выполнением работы рекомендуется вводная гимнастика. Первый перерыв на отдых устанавливается не ранее чем через 2,5-3 часа после начала работы. Суммарное время на отдых установлено в процентах от длительности смены 10-12.

Устранение переутомления повышает эффективность труда, производительность производственного процесса, а значит является важным рычагом управления производства, повышения конкурентоспособности предприятия на рынке.

Планировка рабочего места

При проектировании любого устройства необходимо всемерно облегчить труд человека, создать ему максимум удобств, сделать рабочее место безопасным. При планировке рабочего места учитываются антропометрические данные тела человека: размеры, форму, вес, силу и направление движение движения рук и ног, особенности зрения и слуха.

Между размерами тела и оборудования соблюдается пропорциональное соотношение. Рабочее место должно быть максимально приспособлено к условиям каждой операции. Рабочая зона при рабочем положении ”сидя” составляет по высоте 600-1200 мм., по глубине 500 мм. и по фронту 550 мм. от центра сидения.

Размеры рабочей зоны и высоты рабочей поверхности должны быть рассчитаны на свободную позу - попеременно стоя и сидя. При проектировании рабочего места соблюдают правило естественности движений. Особое внимание уделяется расчету необходимой площади: на каждого полагается не менее 4,5 кв. м. при высоте помещения 3,2 м.

Рабочая поза

Сегодня специалисты в области эргономики уже поняли, что нельзя найти идеальное положение, в котором можно работать в течение всего дня. Для большинства людей комфортабельным рабочим местом должно быть такое, которое можно приспособить не менее чем для двух позиций, при этом положение кресла, монитора и клавиатуры должны каждый раз соответствовать выполняемой пользователем работе и его привычкам. Если пользователь выполняет большой объем работы в сидячем положении, то, возможно, наклонение кресла вперед.

Необходимо постоянно двигаться - движение стимулирует кровообращение. Необходим ежечасный перерыв в работе продолжительностью 15 минут.

В процессе труда человек принимает различные позы и сохраняет некоторые из них в течении длительного времени. Особое требование к рабочей позе - прямая осанка. Для сохранения прямой осанки и предупреждения искривления позвоночника ось тела должна совпадать с вертикальной осью рабочей зоны. Если рабочее место ограничено, то позу выбирают в зависимости от статических усилий при работе.

При рабочей позе “сидя” колени должны находится под рабочей плоскостью, что особенно важно для пользователя ПК. Кроме того, предусмотрены специальные сидения, позволяющие практически полностью убрать нагрузку на позвоночник.

Рабочую позу “стоя” применяют при визуальном наблюдении за работой машины, при работах со значительными физическими усилиями, с большим количеством движений, размах которых превышает 1000 мм. по фронту, 300 мм. в глубину, 400 мм. от поверхности рабочей зоны и с углом зрения 30.

Рабочая поза “стоя” правильна, если работающий стоит с легким наклоном вперёд, причём угол наклона не должен превышать 10-15, т.к. большой наклон связан с увеличением статических напряжений.

Переменная поза “сидя-стоя” используется в том случае, если возможен обзор средств индикации или оборудования и стоя и сидя.

При планировке рабочего места необходимо обеспечивать нормальные условия обзора. Зону обзора описывает угол, вершина которого находится в центре глаза, а стороны составляют границы, в которых человек, при фиксированном положении глаза хорошо различает предметы и их местонахождение. В горизонтальной плоскости этот угол составляет 30-40.

При планировке рабочего места пользователя рекомендуется угол обзора 50-60 включающий и зону менее ясного различия. Допустимый угол по горизонтали не более 90. В вертикальной плоскости угол обзора составляет примерно половину горизонтального угла: оптимальный - 10 вверх и 30 вниз от линии взора, и допустимый - 30 вверх и 40 вниз от линии взора. Ширину поля зрения описывает несколько больший угол, чем зону обзора, т.к. человек может поворачивать голову в стороны: 130 по вертикали и 220 по горизонтали. Чтобы сохранить нормальную остроту зрения, рабочую поверхность располагают от глаза на расстоянии от 0.3 до 0.75 м. Зная величины (угол обзора) и (угол наблюдения знака), можно определить минимально необходимый размер знака и расстояние до наблюдателя от дисплея из соотношений:

H=2*L*tg(/2)(6.1)

h=2*L*tg(/2)(6.2)

где L - расстояние от наблюдателя до экрана по горизонтали;

H - высота обзора;

h - высота знака.

Расстояние до экрана:

L=h/(2*tg(/2))(6.3)

L=H/(2*tg(/2))(6.4)

Таким образом, если пользователь находится на расстоянии 0.6 м., то высота шрифта не должна быть менее 2 - 3 мм..

При увеличении размера знака h может быть пропорционально увеличено и расстояние до наблюдателя. Для того, чтобы улучшить восприятие и переработку человеком информации, уже на стадии проектирования необходимо учесть требования к средствам индикации, направленные на сокращение объёма выдаваемой информации.

Информация может быть двух видов: качественная и количественная. Качественные индикаторы - звуковые и световые. Для сигнальных устройств имеется “Межведомственная нормаль по аппаратуре и приборам”. Количественная информация считывается с приборов. Удобство и легкость зрительного восприятия зависят от “читаемости” индикатора. При определении размера знака необходимо учитывать разрешающую способность зрительной системы и не допускать перенапряжения глаз. Нормальное восприятие достигается если размеры мелких деталей в 3-4 раза превышают разрешающую способность зрения. При распознавании знаков разрешающая способность составляет примерно 0.83-1.5 угловой минуты. Высота знака должна обеспечивать угол зрения не менее 09'-016'. Требуемая санитарными нормами СН-245-63 освещенность на рабочих местах при использовании приборов со штрихами размеров 0.1-0.3 мм. на белом фоне при небольшом контрасте составляет 150 лк. при общем люминесцентном освещении 0.75 лк. от ламп накаливания и 150 лк. при комбинированном освещении.

Правильно спроектированное и выполненное производственное освещение повышает производительность труда, оказывает благоприятное психологическое воздействие, повышает безопасность труда и не вредит здоровью программиста.

Одно из недавних наблюдений показало, что у служащих, работающих на видеотерминалах по 7 или более часов в день, частота случаев воспаления глаз на 42% выше, чем у тех, кто проводит за видеотерминалом, меньше времени. Из 150 пациентов, работавших на видеодисплейных терминалах в среднем по 6 часов в день в течении 4х лет, у 100 - в их числа 41 пациент в возрасте 20-40 лет -наблюдается проблема с фокусировкой зрения.

Пользователи видеодисплейных терминалов, как и все люди, могут иметь дефекты зрения, о которых они даже не подозревают. Пpи наличие таких дефектов интенсивная работа с дисплеем, требующая постоянного напряжения зрения, может привести к возникновению и других заболеваний глаз. Многие из них можно избежать с помощью специальных очков, тогда как другие проблемы, связанные со здоровьем, обязаны своим существованием неудачной конструкции рабочего места и присутствию бликов на экране. Для того чтобы защитить глаза необходимо помнить о следующем:

- прежде чем начинать работу на ЭВМ необходимо пройти всестороннее обследование у окулиста;

- терминал не должен быть обращен экраном к окну, так как интенсивная освещенность поля зрения может затопить глаза потоками света и размыть изображение оригинала на сетчатке;

- уровень освещенности рабочего места должен составлять 2/3 от нормальной освещенности служебных помещений (210 - 540 лк);

- необходима оптимальная направленность светового потока. Свет должен падать под углом 60 градусов к ее нормали.

- состав света должен быть оптимальным, т.е. естественное освещение плюс искусственный источник со спектральной характеристикой, близкой к солнечной.

- осветительная установка не должна быть источником дополнительной опасности.

- избавляться от бликов можно при помощи штоp, занавесок или жалюзей, ограничивающие световой поток;

- стена или какая-нибудь дpугая повеpхность сзади пpогpаммиста должна быть освещена так же как и экpан;

- если нельзя избавиться от бликов, то необходимо пользоваться специальными фильтpами для экpана.

Требования к органам управления

При работе на ПК, с КИП, основное время затрачивается на управление и наблюдение. Органы управления (клавиатура, пусковые кнопки, тумблеры, переключатели и т.д.) устанавливаются в пределах рабочей зоны и досягаемости рук. Наилучшее размещение органов управления по горизонтали - слева направо, а по вертикала - сверху вниз. Порядок расположения органов управления должен соответствовать последовательности их в процессе работы. Недопустима одновременная работа разработчика несколькими органами управления. При планировании расположения органов управления необходимо предусматривать минимум времени для переключения с определёнными физическими усилиями и удобство конструкции органа управления для захвата рукой.

Требования к дисплею

Положение тела обычно соответствует направлению взгляда; дисплеи расположенные слишком низко или под неправильным углом, являются основными причинами появления сутулости. Расстояние от дисплея до глаз должно лишь немного превышать привычное для пpогpаммиста расстояние между книгой и глазами (обычно в пределах 50 - 60 см). Регуляторы яркости и контраста должны находится в таком положении, чтобы изображение было четким и не утомляло глаза.

Требования к креслу

Фоpма спинки кресла должна повторять форму спины. Кpесло необходимо установить на такой высоте, чтобы человек не чувствовал давления на копчик (кpесло расположено слишком низко) , или на бедра (кpесло расположено слишком высоко). Специалисты по эргономике считали, что угол между бедрами и позвоночником должен составлять 90 градусов, однако недавно проведенные исследования показали, что большинство людей предпочитают сидеть несколько откинувшись.

Требования к клавиатуре

Руки программиста должны располагаться так, чтобы они находились на расстоянии нескольких сантиметров от туловища. Кресло и клавиатуру необходимо установить так, чтобы не надо было далеко тянуться. При изменении положения тела (например, с вертикального на наклонное) необходимо обязательно переменить положение клавиатуры и дисплея. Здесь может оказаться полезной регулируемая подставка клавиатуры, благодаря которой можно без всякого напряжения работать с манипулятором "мышь". Также можно поставить клавиатуру и на колени.

Требования к рабочему столу

Удобная высота стола особенно важна в том случае, когда на нем располагается клавиатура. Если клавиатура не имеет подставки, а высоту стола нельзя изменить (и он слишком высок), то необходимо повыше поднять сиденье кресла, а под ноги подставить скамеечку или что-нибудь другое. Если стол слишком низок, необходимо подложить что-нибудь под его ножки.

Требования к оригиналодержателю

Если при работе приходится часто смотреть на документы, необходимо установить подставку с оригиналом в одной плоскости с экраном и на одной высоте с ним. Если необходимо чаще смотреть на оригинал, чем на экран, необходимо кресло или экран повернуть таким образом, чтобы прямо перед лицам располагался не экран, а оригинал.

Влияние шума

Работающие ЭВМ и миниЭВМ могут являться источниками шума на предприятиях. Шум неблагоприятно действует на организм человека, вызывая различные физиологические отклонения в организме, психологические заболевания и снижает работоспособность. Утомление пользователей и операторов ЭВМ из-за шума увеличивает число ошибок при работе, способствует возникновению травм.

Шум - это совокупность звуков различной частоты и интенсивности.

Характеристикой шума с точки зрения физиологического восприятия является понятие громкость шума. Количественную оценку уровня громкости шума различных источников проводят путем сравнения с шумом на частоте 1000 Гц, для которого уровень силы принят равным уровню громкости. При этом для измерения уровня громкости шума введена единица в 1 фон. За один фон принят уровень громкости шума частотой 1000 Гц при уровне силы шума 1 дБ.

Воздействие излучения

Спектр излучения компьютерного монитора включает в себя рентгеновскую, ультрафиолетовую и инфракрасную область, а также широкий диапазон электромагнитных волн других частот. От рентгеновских лучей опасности практически нет, так как они полностью поглощаются веществом экрана. Наибольшую опасность представляют биологические эффекты низкочастотных электромагнитных полей, которые до настоящего времени считались абсолютно безвредными. В ряде экспериментов было обнаружено, что электромагнитные поля с частотой 60 Гц могут инициировать биологические сдвиги (вплоть до нарушения синтеза ДНК) в клетках животных. В отличие от рентгеновских лучей электромагнитные волны обладают необычным свойством - опасность их воздействия не обязательно уменьшается с уменьшением интенсивности облучения; определенные электромагнитные волны действуют на клетку лишь при малых интенсивностях излучения или в конкретных частотах - в окнах прозрачности.

Поскольку источник высокочастотного напряжения компьютера - строчный трансформатор - помещается в задней или боковой части терминала, уровень излучения со стороны задней панели дисплея выше, причем стенки корпуса не экранируют излучения. Пользователи должны находиться не ближе чем на 1,2 м от задних или боковых поверхностей соседних терминалов. Pяд специалистов рекомендуют сидеть на расстоянии 70 см от экрана дисплея - однако в этом случае необходима консультация с окулистом.

Рекомендуется устанавливать на экран монитора заземленные фильтры , которые частично экранируют магнитные поля, а также устраняют статические поля.

Основные выводы

- учет вопросов эргономики необходим для создания условий безопасного и продуктивного труда пользователей персональных компьютеров;

- важнейшим эргономическим требованием является оптимальная конструкция рабочего места программиста, а именно: положение кресла, высота рабочего стола, расположение дисплея, конструкция клавиатуры, положение тела при работе. Профеcсионального заболевания программистов - СДСН - можно избежать только при оптимальной конструкции рабочего места для каждого конкретного человека;

- большое значение имеет психофизиологический фактор, поскольку работа программиста связана с большой моральной и умственной нагрузкой;

- следует уделять внимание правильному освещению рабочего помещения, влиянию шума на продуктивность работы, а также излучению работающего электронного оборудования.

7.Технологическая часть

Технологический маршрут изготовления КМОП-ячейки БМК ТЦ-5500

Базовая КМОП-технология НПК ТЦ представляет собой р-карманный вариант КМОП-технологии с самосовмещенными относительно стоков и истоков поликремневыми затворами и одним уровнем алюминиевой металлизации. Проектные нормы базовой технологии составляют 2.5 мкм.

Технологический маршрут изготовления КМОП ИС включает 9 операций фотолитографий, выполняемые проекционным методом. Основные стадии изготовления ИС приведены на рис.1 (все рисунки данной главы см. в приложении III).

Путем термического окисления исходной кремниевой пластины формируется пленка SiO2 (рис.а). После 1 фотолитографии вскрываются области р-кармана в этой пленке и проводится ионная имплантация бором через окисел толщиной 500А ( рис.б). Последующий отжиг завершает формирование областей р-кармана. Следующий этап включает формирование активных областей транзисторов - мезаобластей и изолирующих областей - изопланарного окисла. (рис.в-д) После осаждения нитрида кремния проводится 2 фотолитография. Путем плазмохимического травления удаляется нитрид кремния с незащищенных фоторезистор участков (рис в). Для предотвращения образования инверсных каналов проводится ионная имплантация сначала фосфором в незащищенное нитридом кремния участки поверхности, а затем, после 3 фотолитографии, бором в незащищенные участки поверхности областей р-кармана (рис.г). Термическое окисление под давлением завершает формирование мезаобластей и изолирующих областей. При этом участки покрытые нитридом кремния не окисляются, а вне этих участков вырастает окисел толщиной 1 мкм. (рис.д). Следующий этап технологического маршрута - формирование транзисторов (рис.е-к). После жидкостного удаления нитрида кремния проводится выращивание подзатворного окисла и осаждение поликристаллического кремния (рис.е). 4 фотолитография и плазмохимическое травление поликремния формирует затворы транзисторов и участки поликремневой разводки (рис.ж). После тонкого термического окисления участков поликремний для создания стоков и истоков транзисторов проводится сначала 5 фотолитография и ионная имплантация фосфора (рис.з), а затем 6 фотолитография и ионная имплантация бора (рис.и). Последующий отжиг завершает формирование транзисторов, и для создания межслойной изоляции проводится пиролитическое осаждение окисла кремния (рис.к). Заключительный этап изготовления ИС - формирование металлизации. После 7 фотолитографии проводится травление контактных окон к областям стока, истока и электроду затвора с помощью комбинированного плазмохимического и жидкостного травления. Напыление пленки алюминий-кремний, 8 фотолитография и прецизионное ;жидкостное травление этой пленки формируют алюминиевые межсоединения. В заключении, для защиты ИС от внешней среды проводится осаждение пленки фосфоросиликатного стекла. Итоговая структура ИС приведена на рис.л.

Ниже представлен маршрут изготовления КМОП-ячейки для БМК “ТЦ-5500”.

Технологический маршрут изготовления кристалла “ТЦ-5500”

Тип пластин: КЭФ - 4.5 ( ориентация 100 )

1. Химическая очистка ( каро + пар).

2. Окисление ( Т = 1000оС, 0.3мкм ).

3. Стравливание SiO2 ( до скатывания ).

4. Химическая очистка ( пар ).

5. Окисление ( Т = 1000оС, пар, 0.65мкм ).

6. Фотолитография p-кармана.

7. Плазмохимическая зачистка.

8. Жидко-химическое травление SiO2 до Si*, h=0.65 мкм.

9. Снятие фоторезиста.

10. Химическая очистка ( каро + пар ).

11. Окисление, (О2 , Т=1000оС, 500 А).

12. Ионное легирование бором (Е=80 кэВ, D=3мкКл/см2).

13. Химическая очистка ( каро + пар ).

14. Разгонка кармана ( T=1200оС, 2ч в сухом О2 + 6ч N2 ).

15. Стравливание окисла Si ( до скатывания ).

16. Химическая очистка ( каро + пар ).

17. Окисление под нитрид ( Т=1000оС, в парах HС1, 500 А ).

18. Осаждение нитрида ( 0.18 - 0.2 мкм ).

19. Фотолитография №2, изоляции “LOCOS”.

20. Плазмохимическое травление нитрида до SiO2 ( 0.2 мкм ).

21. Ионная имплантация фосфора, n-охрана ( Е=80 кэВ, D=0.2 мкКл/см2 ).

22. Снятие фоторезиста ( каро ).

23. Химическая очистка ( каро + пар ).

24. Фотолитография p+-охраны.

25. Ионная имплантация бора, p-охрана ( E=30 кэВ, D=30 мкКл/см2).

26. Снятие фоторезиста ( каро ).

27. Химическая очистка ( каро + пар ).

28. Травление окисла кремния ( d=500 A).

29. Химическая очистка ( каро + пар ).

30. Отжиг ( разгонка бора, Т=1000оС, 30 мин, N2) .

31. Окисление ( "Термоком", d=0.8 мкм ).

32. Стравливание нитрида кремния ( d=0.18-0.2 мкм ).

33. Стравливание окисла кремния (500 A до вскрытия мезообластей ).

34. Химическая очистка ( пар ).

35. Предварительное окисление ( 425 A ).

36. Стравливание окисла ( 425 A ).

37. Химическая очистка ( каро + пар ).

38. Окисление под затвор ( Т=1000оС, 425 A в О2+ 3-5% HCl ).

39. Осаждение поликремния ( 0.4 мкм ).

40. Химическая очистка ( каро + пар ).

41. Диффузия фосфора ( Т=9000С, Rs =20 см/кв. ).

42. Снятие ФСС.

43. Химическая очистка ( каро + пар ).

44. Фотолитография Si*-затвора.

45. Плазмо-химическое травление поликремния ( 0.4 мкм ).

46. Снятие фоторезиста ( каро ).

47. Химическая очистка ( каро + пар ).

48. Окисление поликремния ( Т=9500оС, 400 A ).

49. Химическая очистка ( каро + пар ).

50. Фотолитография n+ - стоков - истоков.

51. Ионная имплантация фосфора ( Е=80 кэВ, D=1400 мкКл/см ).

52. Плазмохимическое травление фоторезиста.

53. Снятие фоторезиста.

54. Химическая очистка ( каро + пар ).

55. Фотолитография p+ - стоков - истоков.

56. Ионная имплантация бора сток-исток ( Е=40 кэВ, D=700мкКл/см2 ).

57. Плазмохимическое травление фоторезиста.

58. Снятие фоторезиста ( каро ).

59. Химическая очистка ( каро + пар ).

60. Отжиг стоков и истоков (T=850C,10 мин H2O+10 мин сух. O2+10 мин H2O).

61. Химическая очистка ( каро + пар ).

62. Осаждение SiO2 ( d=0.4 мкм ).

63. Уплотнение SiO2.

64. Фотолитография контактных окон.

65. Плазмо-химическое травление окисла ( 0.4 мкм ).

66. Жидко-химическое травление SiO2 ( 0.1 мкм ).

67. Снятие фоторезиста ( каро ).

68. Химическая очистка ( каро + пар ).

69. Освежение.

70. Напыление Al + Si ( 1 мкм ).

71. Фотолитография металла разводки.

72. Жидкостно-химическое травление Al.

73. Плазмохимическое снятие фоторезиста.

74. Снятие фоторезиста в ДМФА.

75. Химическая очистка в ДМФА.

76. Осаждение ФСС ( пассивация, 0.9 мкм , 3-4% P ).

77. Фотолитография пассивации.

78. Плазмохимическое травление ФСС ( 0.9 мкм ).

79. Снятие фоторезиста в ДМФА.

80. Химическая очистка в ДМФА.

81. Вжигание Al + Si контактов ( T=450оC ).

82. Измерение характеристик.

Литература

Ю. М. Ильин, Т. Л. Короткова, Г. Д. Костина. Методические указания к курсовой работе и дипломному проектированию по расчету экономической эффективности от внедрения АСУТП и САПР. - М. : МИЭТ, 1987.

РМ Система автоматизированного проектирования изделий электронной техники. Методика определения экономической эффективности.

Методика расчета экономической эффективности программных средств вычислительной техники. - М. 1989.

Методика (основные положения) определения экономической эффективности использования в народном хозяйстве новой техники, изобретений и рационализаторских предложений. - М. 1987.

Г. Г. Казеннов, Е. В. Сердобинцев. Автоматизация проектирования БИС. Проектирование топологии матричных БИС. - М. : Высшая школа, 1990.

М. Ватанабэ и др. . Проектирование СБИС. - М. : Мир, 1988.

Л. А. Константинова, Н. М. Ларионов, В. М. Писеев. Методы и средства обеспечения безопасности технологических процессов на предприятиях электронной промышленности. - Учебное пособие по курсу “Охрана труда и окружающей среды”.

Под ред. Шилина А. С.. Охрана труда в машиностроении.

В. И. Каракеян, Л. А. Константинова, В. М. Писеев. Лабораторный практикум по курсу “Производственная и экологическая безопасность в микроэлектронике”.

Приложение

//----------------------------------------------------------------------------

// СОДЕРЖАНИЕ:

// Функции доразмещения и оптимизации ячеек класса ZRazmWindow.

// ПРОГРАММИСТ:

// Кутепов Д.В.

//----------------------------------------------------------------------------

#include <owl\owlpch.h>

#include <classlib\stacks.h>

#include <math.h>

#include "razm.rh"

#include "global\global.h"

#include "global\nstbmk.h"

#include "global\nstyach.h"

#include "global\framemon.h"

#include "topolog\optrazm.h"

#include "topolog\razmwin.h"

#include "razm.h"

#include "statedlg.h"

#include "poleupr.h"

#include "polerazm.h"

#include "listfr.h"

//#define _OTLAD1

//#define _OTLAD2

//#define _OTLAD3

//----------------------------------------------------------------------------

void ZRazmWindow::CmDorazm() {

BOOL ok = TRUE;

if (!IsOkZapasPriv('v')) ok = FALSE;

if (!IsOkZapasPriv('z')) ok = FALSE;

if (!ok) return;

StateOptim = new ZStateOptimDialog(this);

StateOptim->Execute();

delete StateOptim;

StateOptim = 0;

}

void ZRazmWindow::Dorazm() {

CmKeyEsc();

AvtoRazmFr();

}

// Производит автоматическое размещение и оптимизацию фрагмента

void

ZRazmWindow::AvtoRazmFr()

{

float procent;

unsigned long BestSumma, PromSumma;

BOOL FlagRazmZ;

int KolNoRazm, KolNewNoRazm;

ZPsh *RodObj,*Obj,*Obj2;

ZPriv *RPr,*OldPriv;

TIStackAsList<ZPsh> RabStack;

TIArrayAsVector<ZPriv> *RabListXY,*RabListYX;

TIArrayAsVector<ZPsh> SpHranPsh(20, 0, 5);

TIArrayAsVector<ZPsh> SpHranPerifYach(10, 0, 5);

TIListImp<ZPriv> SpHranPriv;

TIListImp<ZPriv> SpHranPerifPriv;

const ZOptRazm& optRazm = *GlobalData->GetOptRazm();

// Формируем список ячеек для размещения: все неразмещенные ячейки в

// незафиксированных подфрагментах текущего фрагмента.

RabStack.OwnsElements(0);

SpHranPsh.OwnsElements(0);

SpHranPerifYach.OwnsElements(0);

RabStack.Push(PtrTekFr);

while (!RabStack.IsEmpty()) {

RodObj = RabStack.Pop();

if (!RodObj->IsFixed) {

for (int i=0; i < RodObj->SostavPsh->GetItemsInContainer(); i++) {

Obj = (*RodObj->SostavPsh)[i];

if (Obj->IsYach()) {

if (!Obj->PrivYach) {

ZNstYach nstYach(Obj->Name);

switch (nstYach.typ) {

case 'v': SpHranPsh.Add(Obj); break;

case 'z': SpHranPerifYach.Add(Obj); break;

default: PROG_LOV;

}

Obj->InMassiv=TRUE;

}

} else RabStack.Push(Obj);

}

}

}

# ifdef _OTLAD1

{

PrMsg("OTLAD1: Список ячеек типа 'v' для размещения.\n");

for (int i=0; i < SpHranPsh.GetItemsInContainer(); i++) {

PrMsg("i=%3d Name=%6s id=%s%s\n", i, SpHranPsh[i]->Name,

SpHranPsh[i]->IdGrup, SpHranPsh[i]->IdPsh);

}

PrMsg("OTLAD1: Список ячеек типа 'z' для размещения.\n");

for (i=0; i < SpHranPerifYach.GetItemsInContainer(); i++) {

PrMsg("i=%3d Name=%6s id=%s%s\n", i, SpHranPerifYach[i]->Name,

SpHranPerifYach[i]->IdGrup, SpHranPerifYach[i]->IdPsh);

}

}

# endif

// Проверяем, что связанные с данным фрагментом периферийные ячейки размещены.

TIArrayAsVectorIterator<ZPsh> itt(SpHranPsh);

FlagRazmZ=TRUE;

while (itt!=0 && FlagRazmZ){

Obj=itt++;

for (int kont=0; kont < Obj->KolKontPsh; kont++) {

TIListIteratorImp<ZPsh> iter2(*(Obj->SpIncidYach[kont]));

while (iter2!=0){

Obj2=iter2++;

ZNstYach nstYach(Obj2->Name);

if (nstYach.typ=='z' && Obj2->PrivYach==NULL) FlagRazmZ=FALSE;

}

}

}

BOOL flagContinue = TRUE;

if (!FlagRazmZ) {

char msg[512];

wsprintf(msg, GetModule()->LoadString(IDS_NO_ALL_PERIF_RAZM).c_str(), PtrTekFr->Name);

if (MessageBox(msg, GetModule()->GetName(), MB_YESNO | MB_ICONQUESTION) != IDYES) {

flagContinue = FALSE;

StateOptim->Destroy();

} else {

PoleRazm->UpdateWindow();

StateOptim->UpdateWindow();

StateOptim->SetFocus();

}

}

if (!flagContinue) return;

// Формируем список привязок для размещения и оптимизации:

// запланированная свободная область под фрагменты плюс область уже стоящих

// незафиксированных ячеек в незафиксированных фрагментах.

RabStack.Push(PtrTekFr);

while (!RabStack.IsEmpty()) {

RodObj = RabStack.Pop();

TIListIteratorImp<ZPriv> iter(*(RodObj->SostavPriv));

while (iter) {

RPr = iter++;

if (!RPr->Yach) {

switch (RPr->Typ) {

case 'v': SpHranPriv.Add(RPr); break;

case 'z': SpHranPerifPriv.Add(RPr); break;

default: PROG_LOV;

}

}

}

for (int i=0; i < RodObj->SostavPsh->GetItemsInContainer(); i++) {

Obj = (*RodObj->SostavPsh)[i];

if (Obj->IsYach()) {

if (Obj->PrivYach && !Obj->IsFixed && !RodObj->IsFixed) {

ZNstYach nstYach(Obj->Name, &TPoint(Obj->PrivYach->XPriv, Obj->PrivYach->YPriv));

for (int j=0; j< nstYach.kol_pokr_toch_priv; j++) {

RPr = PoleRazm->FindPrivKoord(nstYach.pokr_toch_priv[j].x, nstYach.pokr_toch_priv[j].y);

if (!RPr) PROG_LOV;

switch (RPr->Typ) {

case 'v': SpHranPriv.Add(RPr); break;

case 'z': SpHranPerifPriv.Add(RPr); break;

default: PROG_LOV;

}

}

}

} else RabStack.Push(Obj);

}

}

MaxX = 0;

MaxY = 0;

MinX = GlobalData->GetNstBMK()->gabarit_x_bmk;

MinY = GlobalData->GetNstBMK()->gabarit_y_bmk;

TIListIteratorImp<ZPriv> iter(SpHranPriv);

while (iter!=0) {

RPr=iter++;

if (RPr->XPriv > MaxX) MaxX = RPr->XPriv;

if (RPr->YPriv > MaxY) MaxY = RPr->YPriv;

if (RPr->XPriv < MinX) MinX = RPr->XPriv;

if (RPr->YPriv < MinY) MinY = RPr->YPriv;

}

RabListXY = new TIArrayAsVector<ZPriv>(20,0,5);

RabListYX = new TIArrayAsVector<ZPriv>(20,0,5);

TIListIteratorImp<ZPriv> rit2(SpHranPriv);

while (rit2) {

RPr = rit2++;

RabListXY->Add(RPr);

RabListYX->Add(RPr);

}

UporadSpXY(RabListXY, TRUE);

UporadSpXY(RabListYX, FALSE);

// Доразмещение периферийных ячеек фрагмента.

int tekSum, bestSum;

ZPriv* bestPriv;

if (SpHranPerifYach.GetItemsInContainer() >0) StateOptim->State->SetText("Размещение Z-яч.");

for (int i=0; i< SpHranPerifYach.GetItemsInContainer(); i++) {

Obj = SpHranPerifYach[i];

bestSum = INT_MAX;

bestPriv = 0;

TIListIteratorImp<ZPriv> iter(SpHranPerifPriv);

while (iter) {

RPr = iter++;

if (!RPr->Yach) {

tekSum = SummaDln(Obj, RPr, FALSE);

if (tekSum < bestSum) {

bestSum = tekSum;

bestPriv = RPr;

}

}

}

if (!bestPriv) PROG_LOV;

TDC& DC = PoleRazm->SetDC(TClientDC(*PoleRazm));

PoleRazm->RazmYach(DC, Obj, bestPriv, ZPsh::NoFixed);

}

// Оптимизация периферийных ячеек фрагмента.

GetSpYachOptim(SpHranPerifYach, 'z');

OptimizePerif(SpHranPerifYach, SpHranPerifPriv);

//

// Первоначальное размещение ячеек.

//

OldPriv = NULL;

KolNoRazm = 0;

if (SpHranPsh.GetItemsInContainer() > 0) {

StateOptim->State->SetText("Размещение.");

SortirSpiska(&SpHranPsh);

for (int i=0; i<SpHranPsh.GetItemsInContainer(); i++){

Obj=SpHranPsh[i];

PrivOdnojYach(&SpHranPriv, Obj, FALSE, OldPriv, RabListXY, RabListYX);

if (Obj->PrivYach!=NULL){

OldPriv = Obj->PrivYach;

Obj->BestPriv=Obj->PrivYach;

}

else KolNoRazm++;

if (PtrTekFr->KolYach >0) {

procent = ((float)PtrTekFr->KolRazmYach/ PtrTekFr->KolYach)*100;

SetTextState(StateOptim->ProcentRazm, procent);

}

}

}

TIArrayAsVectorIterator<ZPsh> iterr(SpHranPerifYach);

iterr.Restart();

while (iterr!=0){

Obj=iterr++;

Obj->BestPriv=Obj->PrivYach;

}

//

// Оптимизация первоначального размещения.

//

GetSpYachOptim(SpHranPsh, 'v');

OldPriv = NULL;

BestSumma = ShowSummaSv(&SpHranPsh);

TIArrayAsVectorIterator<ZPsh> itr(SpHranPsh);

BOOL FlagFirst = TRUE;

for (unsigned long yy=1; yy <= optRazm.KolCiklOptim(); yy++){

SetTextState(StateOptim->TekKolOpt1, 0UL);

SetTextState(StateOptim->TekKolOpt2, 0UL);

SetTextState(StateOptim->TekKolOpt3, 0UL);

if (optRazm.IsOptimRerazm) {

StateOptim->State->SetText("Оптимизация 1.");

for (unsigned long y1=1; y1 <= optRazm.KolIterRerazm(); y1++){

// Снимаем все размещенные ячейки.

itr.Restart();

while (itr!=0){

Obj=itr++;

RPr=Obj->PrivYach;

if (RPr!=NULL){

TDC& DC = PoleRazm->SetDC(TClientDC(*PoleRazm));

PoleRazm->DeleteRazmYach(DC,Obj->PrivYach,FALSE);

Obj->OldPrivYach=RPr;

}

}

// После(!) снятия ячеек сортируем список ячеек для оптимизации.

if (FlagFirst){

FlagFirst=FALSE;

SortirSpiska(&SpHranPsh);

}

// Выполняем оптимизацию.

KolNewNoRazm = 0;

for (int i=0; i<SpHranPsh.GetItemsInContainer(); i++){

Obj=SpHranPsh[i];

PrivOdnojYach(&SpHranPriv,Obj,FALSE,OldPriv, RabListXY,RabListYX);

if (Obj->PrivYach!=NULL) OldPriv = Obj->PrivYach;

else KolNewNoRazm++;

procent=100.0* (i+1)/ SpHranPsh.GetItemsInContainer();

SetTextState(StateOptim->ProcentOptim, procent);

}

OptimizePerif(SpHranPerifYach, SpHranPerifPriv);

// Запоминаем лучшее размещение.

PromSumma= ShowSummaSv(&SpHranPsh);

if ((KolNewNoRazm < KolNoRazm) || (KolNewNoRazm == KolNoRazm && PromSumma < BestSumma)) {

KolNoRazm = KolNewNoRazm;

BestSumma = PromSumma;

itr.Restart();

while (itr!=0){

Obj=itr++;

Obj->BestPriv=Obj->PrivYach;

}

iterr.Restart();

while (iterr!=0){

Obj=iterr++;

Obj->BestPriv=Obj->PrivYach;

}

}

SetTextState(StateOptim->TekKolOpt1, y1);

}

}

if (optRazm.IsOptimLocalMove){

StateOptim->State->SetText("Оптимизация 2.");

for (unsigned long y1=1; y1 <= optRazm.KolIterLocalMove(); y1++){

int i=0;

KolNewNoRazm = 0;

itr.Restart();

while (itr!=0){

Obj=itr++;

i++;

RPr=Obj->PrivYach;

if (RPr!=NULL){

TDC& DC = PoleRazm->SetDC(TClientDC(*PoleRazm));

Obj->OldPrivYach=Obj->PrivYach;

PoleRazm->DeleteRazmYach(DC,Obj->PrivYach,FALSE);

PrivOdnojYach(&SpHranPriv,Obj,FALSE,OldPriv,RabListXY,RabListYX);

if (Obj->PrivYach!=NULL) OldPriv = Obj->PrivYach;

else KolNewNoRazm++;

}

procent=100.0* i/ SpHranPsh.GetItemsInContainer();

SetTextState(StateOptim->ProcentOptim, procent);

}

OptimizePerif(SpHranPerifYach, SpHranPerifPriv);

// Запоминаем лучшее размещение.

PromSumma= ShowSummaSv(&SpHranPsh);

if ((KolNewNoRazm < KolNoRazm) || (KolNewNoRazm == KolNoRazm && PromSumma < BestSumma)) {

KolNoRazm = KolNewNoRazm;

BestSumma = PromSumma;

itr.Restart();

while (itr!=0){

Obj=itr++;

Obj->BestPriv=Obj->PrivYach;

}

iterr.Restart();

while (iterr!=0){

Obj=iterr++;

Obj->BestPriv=Obj->PrivYach;

}

}

SetTextState(StateOptim->TekKolOpt2, y1);

}

}

if (optRazm.IsOptimSilAlgor){

StateOptim->State->SetText("Оптимизация 3.");

for (unsigned long y1=1; y1 <= optRazm.KolIterSilAlgor(); y1++){

Optimize3(&SpHranPsh, &SpHranPriv);

OptimizePerif(SpHranPerifYach, SpHranPerifPriv);

// Запоминаем лучшее размещение.

PromSumma= ShowSummaSv(&SpHranPsh);

if (PromSumma < BestSumma){

BestSumma = PromSumma;

itr.Restart();

while (itr!=0){

Obj=itr++;

Obj->BestPriv=Obj->PrivYach;

}

iterr.Restart();

while (iterr!=0){

Obj=iterr++;

Obj->BestPriv=Obj->PrivYach;

}

}

SetTextState(StateOptim->TekKolOpt3, y1);

}

}

SetTextState(StateOptim->TekKolCikl, yy);

} // yy

RabListXY->Flush(TShouldDelete::NoDelete);

RabListYX->Flush(TShouldDelete::NoDelete);

delete RabListXY;

delete RabListYX;

// Формируем окончательное размещение.

if (SpHranPsh.GetItemsInContainer() > 0){

TIArrayAsVectorIterator<ZPsh> itp(SpHranPsh);

TDC& DC = PoleRazm->SetDC(TClientDC(*PoleRazm));

while (itp!=0){

Obj=itp++;

if (Obj->PrivYach !=NULL) PoleRazm->DeleteRazmYach(DC,Obj->PrivYach,FALSE);

Obj->NomMassiv=0;

Obj->KolSvias=0;

}

itp.Restart();

while (itp!=0){

Obj=itp++;

if (Obj->BestPriv!=NULL) PoleRazm->RazmYach(DC, Obj, Obj->BestPriv, ZPsh::NoFixed);

}

iterr.Restart();

while (iterr!=0){

Obj=iterr++;

if (Obj->PrivYach !=NULL) PoleRazm->DeleteRazmYach(DC,Obj->PrivYach,FALSE);

Obj->NomMassiv=0;

Obj->KolSvias=0;

}

iterr.Restart();

while (iterr!=0){

Obj=iterr++;

if (Obj->BestPriv!=NULL) PoleRazm->RazmYach(DC, Obj, Obj->BestPriv, ZPsh::NoFixed);

Obj->BestPriv =0;

}

ShowSummaSv(&SpHranPsh);

itp.Restart();

while (itp!=0){

Obj=itp++;

Obj->InMassiv=FALSE;

Obj->BestPriv =0;

Obj->OldPrivYach =0;

}

}

PoleUpr->PaintSpYach();

PoleUpr->PaintSpFr();

StateOptim->State->SetText("Процесс завершен.");

}

// Формирует список ячеек для оптимизации: все незафиксированные ячейки

// в незафиксированных фрагментах.

void ZRazmWindow::GetSpYachOptim(TIArrayAsVector<ZPsh>& spYach, int typYach)

{

TIStackAsList<ZPsh> rabStack;

ZPsh *rodObj, *obj;

rabStack.OwnsElements(0);

spYach.Flush();

rabStack.Push(PtrTekFr);

while (!rabStack.IsEmpty()) {

rodObj = rabStack.Pop();

if (!rodObj->IsFixed) {

for (int i=0; i < rodObj->SostavPsh->GetItemsInContainer(); i++) {

obj = (*rodObj->SostavPsh)[i];

if (obj->IsYach()) {

if (obj->PrivYach && !obj->IsFixed && obj->PrivYach->Typ==typYach) {

spYach.Add(obj);

obj->BestPriv = obj->PrivYach;

obj->OldPrivYach = obj->PrivYach;

obj->InMassiv = TRUE;

}

} else rabStack.Push(obj);

}

}

}

# ifdef _OTLAD2

{

PrMsg("OTLAD2: Список ячеек типа '%c' для оптимизации.\n", typYach);

for (int i=0; i < spYach.GetItemsInContainer(); i++) {

PrMsg("i=%3d Name=%6s id=%s%s\n", i, spYach[i]->Name, spYach[i]->IdGrup, spYach[i]->IdPsh);

}

}

# endif

}

// Возвращает сумму длин для ячейки SelYach в точке APriv

// ( FlagAllSum=TRUE если вычисляется сумма длин связей нескольких

// связанных друг с другом ячеек).

long ZRazmWindow::SummaDln(ZPsh *SelYach, ZPriv* APriv, BOOL FlagAllSum)

{

struct YACH_CEP { // Ячейка, подключенная к цепи.

int NomPriv; // Номер привязки ячейки.

BOOL FlagSoed; // Флаг соединения ячейки.

};

struct CENTR_PRIV { // Координаты центра привязки.

ZPriv* Priv; // Привязка ячейки.

float Koef; // Коэффициент учета предыдущего размещения.

int x; // Координата Х.

int y; // Координата У.

};

// Коэффициент учета предыдущего размещения (от 0 до 1, лучше 0.4-0.6).

float koefPredRazm = 0.4;

YACH_CEP* YachCep;

CENTR_PRIV* Centr;

int KolRazmYachCep,KolSoedYachCep,NomSoed,NomNeSoed,Rasst,MinRasst;

int kont,kol,kol1,i,j,nom,KolPriv,PrivSoed,PrivNeSoed,InMassiv;

long DlSvyaz=0;

ZPriv *ptr1,*ptr2,*RPrYach;

ZPsh* obj;

kol=kol1=0;

for (kont=0; kont<SelYach->KolKontPsh; kont++) {

kol=max(kol, SelYach->SpIncidYach[kont]->GetItemsInContainer());

kol1+=SelYach->SpIncidYach[kont]->GetItemsInContainer();

}

SelYach->KolSvias=kol1;

kol++; kol1++;

YachCep = new YACH_CEP[kol];

Centr = new CENTR_PRIV[kol1];

Centr[0].Priv=APriv;

Centr[0].x = (APriv->Rect.left+APriv->Rect.right) /2;

Centr[0].y = (APriv->Rect.top +APriv->Rect.bottom)/2;

Centr[0].Koef =1;

KolPriv = 1;

for (kont=0; kont<SelYach->KolKontPsh; kont++) {

YachCep[0].NomPriv =0;

YachCep[0].FlagSoed=TRUE;

KolRazmYachCep=1;

InMassiv=1;

TIListIteratorImp<ZPsh> iter(*(SelYach->SpIncidYach[kont]));

while (iter!=0) {

obj=iter++;

if (obj->PrivYach!=NULL || obj->OldPrivYach!=NULL) {

nom=-1;

if (obj->PrivYach!=NULL) RPrYach=obj->PrivYach;

else RPrYach=obj->OldPrivYach;

for (i=0; i<KolPriv; i++) {

if (Centr[i].Priv==RPrYach) {

nom=i; break;

}

}

if (obj->InMassiv==TRUE) InMassiv++;

if (nom==-1) {

Centr[KolPriv].Priv=RPrYach;

Centr[KolPriv].x=(RPrYach->Rect.left+RPrYach->Rect.right)/2;

Centr[KolPriv].y=(RPrYach->Rect.top+RPrYach->Rect.bottom)/2;

if (obj->PrivYach!=NULL) Centr[KolPriv].Koef= 1;

else Centr[KolPriv].Koef= koefPredRazm;

nom=KolPriv;

KolPriv++;

}

YachCep[KolRazmYachCep ].NomPriv=nom;

YachCep[KolRazmYachCep++].FlagSoed=FALSE;

}

}

KolSoedYachCep=1;

while (KolSoedYachCep< KolRazmYachCep) {

NomSoed=NomNeSoed=-1;

MinRasst=30000;

for (i=0; i<KolRazmYachCep; i++) {

if (!YachCep[i].FlagSoed) continue;

for (j=0; j<KolRazmYachCep; j++) {

if (YachCep[j].FlagSoed) continue;

ptr1=Centr[YachCep[i].NomPriv].Priv;

ptr2=Centr[YachCep[j].NomPriv].Priv;

Rasst=Centr[YachCep[i].NomPriv].Koef*

Centr[YachCep[j].NomPriv].Koef* (abs(ptr1->XPriv-ptr2->XPriv)+

abs(ptr1->YPriv-ptr2->YPriv));

if (Rasst<MinRasst) {

MinRasst=Rasst;

NomSoed =i;

NomNeSoed=j;

}

}

}

if (NomSoed!=-1 && NomNeSoed!=-1) {

PrivSoed =YachCep[NomSoed ].NomPriv;

PrivNeSoed=YachCep[NomNeSoed].NomPriv;

Centr[PrivSoed ].x+=2;

Centr[PrivSoed ].y+=2;

Centr[PrivNeSoed].x+=2;

Centr[PrivNeSoed].y+=2;

YachCep[NomNeSoed].FlagSoed=TRUE;

if (!FlagAllSum)

DlSvyaz+=ceil(Centr[PrivSoed].Koef*Centr[PrivNeSoed].Koef* (abs((Centr[PrivSoed ].Priv)->XPriv-(Centr[PrivNeSoed].Priv)->XPriv)+

abs((Centr[PrivSoed ].Priv)->YPriv-(Centr[PrivNeSoed].Priv)->YPriv)));

else

DlSvyaz+=ceil((Centr[PrivSoed].Koef*Centr[PrivNeSoed].Koef* (abs((Centr[PrivSoed ].Priv)->XPriv-(Centr[PrivNeSoed].Priv)->XPriv)+

abs((Centr[PrivSoed ].Priv)->YPriv-(Centr[PrivNeSoed].Priv)->YPriv)))/ InMassiv);

KolSoedYachCep++;

}

}

}

delete[] YachCep;

delete[] Centr;

return DlSvyaz;

}

static BOOL SravnKoordPriv(ZPriv* priv1, ZPriv* priv2, BOOL PrizXY) {

if (PrizXY)

return priv1->XPriv > priv2->XPriv || (priv1->XPriv == priv2->XPriv && priv1->YPriv > priv2->YPriv);

else

return priv1->YPriv > priv2->YPriv || (priv1->YPriv == priv2->YPriv && priv1->XPriv > priv2->XPriv);

}

// Сортирует список привязок по XY или YX (по возрастанию координат).

// PrizXY=TRUE если сортировка по XY.

void

ZRazmWindow::UporadSpXY(TIArrayAsVector<ZPriv>* arrayPriv, BOOL PrizXY)

{

ZPriv* tmp;

int is, js, zazor;

for (zazor = arrayPriv->GetItemsInContainer()/2; zazor >0; zazor /=2) {

for (is=zazor; is< arrayPriv->GetItemsInContainer(); is++) {

for (js = is - zazor; js >= 0 && SravnKoordPriv((*arrayPriv)[js], (*arrayPriv)[js+zazor], PrizXY); js -= zazor) {

tmp = (*arrayPriv)[js];

(*arrayPriv)[js] = (*arrayPriv)[js+zazor];

(*arrayPriv)[js+zazor] = tmp;

}

}

}

# ifdef _OTLAD3

{

PrMsg("OTLAD3: Список упорядоченных привязок, PrizXY = %d.\n", PrizXY);

for (int i=0; i< arrayPriv->GetItemsInContainer(); i++) {

PrMsg("i=%4d x=%5d y=%5d\n", i, (*arrayPriv)[i]->XPriv,(*arrayPriv)[i]->YPriv);

}

}

# endif

}

// Проверяет, что под фрагмент выделено достаточно привязок заданного типа.

BOOL

ZRazmWindow::IsOkZapasPriv(int typePriv)

{

TIStackAsList<ZPsh> RabStack;

ZPsh *RodObj, *Obj;

ZPriv *tmpPriv;

int kolPrivSvob=0, kolPrivNeobhod=0;

RabStack.OwnsElements(0);

RabStack.Push(PtrTekFr);

while (!RabStack.IsEmpty()) {

RodObj = RabStack.Pop();

TIListIteratorImp<ZPriv> iter(*(RodObj->SostavPriv));

while (iter) {

tmpPriv = iter++;

if (!tmpPriv->Yach && tmpPriv->Typ == typePriv) kolPrivSvob++;

}

for (int i=0; i < RodObj->SostavPsh->GetItemsInContainer(); i++) {

Obj = (*RodObj->SostavPsh)[i];

if (Obj->IsYach()) {

if (!Obj->PrivYach) {

switch (typePriv) {

case 'v':

kolPrivNeobhod += Obj->KolVFakt; break;

case 'z':

kolPrivNeobhod += Obj->KolZFakt; break;


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.