|
nedoPC.orgElectronics hobbyists community established in 2002 |
|
Давайте думать над железкой (TRIADOR)
Author |
Message |
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
Погоди, если я правильно помню, то в DDT у тебя строится дерево вызова функций. А у в компе троичном там циклы бывают. Как ты циклы представишь в DDT?
|
02 Dec 2017 15:53 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22412 Location: Silicon Valley
|
Это переводилка из таблицы истинности в комбинационную схему на мультиплексорах так работает (до автоматической композиции автоматов я пока не дорос) А в системе предопределённых функций в ddt.c есть MEM: | | | | Code: int ddt_mem(int f, DDT c, DDT a, DDT b, DDT* r, int i) { static int ddt_mem_size = 0; static char *ddt_mem_array = NULL; if(f==DDT_SIM) { if(ddt_error(c)||ddt_error(a)||ddt_error(b)||i<0) return DDT_ERROR_ARG; if(!ddt_mem_array) { ddt_mem_array = (char*)malloc(100); if(!ddt_mem_array) return DDT_ERROR_MEM; ddt_mem_size = 100; memset(ddt_mem_array,O,100); } if(i >= ddt_mem_size) { ddt_mem_array = (char*)realloc(ddt_mem_array,(size_t)ddt_mem_size+100); if(!ddt_mem_array) return DDT_ERROR_MEM; memset(&ddt_mem_array[ddt_mem_size],O,100); ddt_mem_size += 100; } switch(c) { case N: ddt_mem_array[i]=(char)a; break; case O: break; case P: ddt_mem_array[i]=(char)b; break; } if(r) *r=ddt_mem_array[i]; return 1; } if(f==DDT_MEM) return 1; return 0; }
| | | | |
Eго пока только "вручную" можно использовать (вставляя в сишный исходник), но можно ведь Там внутри юзается глобальный массив троичных переменных - по одной переменной на каждый MEM, а в качестве лишнего аргумента этой функции передаётся индекс такой переменной в этом глобальном массиве - автоматы более высокого уровня будут при вызове MEM-ов (или автоматов помельче) передавать скорректированный индекс, чтобы схемы нижнего уровня правильные переменные для запоминания состояний исользвали в этом глобальном массиве при каждом шаге симуляции - вобщем как-то так... P.S. Что-то наверное if(i >= ddt_mem_size) надо заменить на while(i >= ddt_mem_size) - кто знает какой там индекс первым прилетит и потом инициализировать наверное надо не нулём, а 'O' (ну или рандомно 'N','O','P' брать для неопределённости начальных состояний)...
|
02 Dec 2017 16:04 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22412 Location: Silicon Valley
|
Начал писать в досовском борланде программу по декоду ternary.circ: исходник | | | | Code: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <graphics.h> #include <conio.h>
int main(int argc, char** argv) { FILE *f; char filename[100]; char circuit[32]; char str[256],*po,*poo; int found = 0; int gd,gm,xmax=0,ymax=0,cmax=0; long x1,y1,x2,y2; *circuit = 0; if(argc<2) { printf("\nUsage:\n\tlogigraf filename.circ [circuit]\n\n"); return -1; } strcpy(filename,argv[1]); if(argc>2) strcpy(circuit,argv[2]); printf("Load \"%s\"\n",filename); f = fopen(filename,"r"); if(f==NULL) return -2; while(1) { fgets(str,256,f); str[255] = 0; if(feof(f)) break; po = strrchr(str,'\n'); if(po!=NULL) *po = 0; if(found) { // printf("%s\n",str); } if(strstr(str,"<circuit")!=NULL) { if(*circuit==0) { printf("%s\n",str); } else { po = strstr(str,"name="); if(po!=NULL) { po = &po[6]; poo = strchr(po,'"'); if(poo!=NULL) *poo=0; printf("Found: \"%s\"\n",po); found = 1; gd=VGA; gm=VGAHI; initgraph(&gd,&gm,""); xmax = getmaxx(); ymax = getmaxy(); cmax = getmaxcolor(); setcolor(0); // setfillstyle(SOLID_FILL,1); bar(0,0,xmax,ymax); } } } else if(strstr(str,"<wire")) { if(found) { po = strstr(str," from="); if(po!=NULL) { po = &po[8]; x1 = atol(po); poo = strchr(po,','); if(poo!=NULL) { poo++; y1 = atol(poo); po = strstr(str," to="); if(po!=NULL) { po = &po[6]; x2 = atol(po); poo = strchr(po,','); if(poo!=NULL) { poo++; y2 = atol(poo); if(x1 <= xmax && y1 <= ymax) { if(x2 > xmax) x2=xmax; if(y2 > ymax) y2=ymax; line(x1,y1,x2,y2); } } } } } } } else if(strstr(str,"</circuit")!=NULL) { if(found) break; } } fclose(f); if(found) { getch(); closegraph(); // printf("%i %i %i\n",xmax,ymax,cmax); } return 0; }
| | | | |
Пока научился выделять нужную схему из файла и рисовать её провода (что влезли в 640x480): Вот что выделилось (только тэг wire):
|
02 Dec 2017 23:30 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22412 Location: Silicon Valley
|
Вроде научился определять где линии стыкуются (начинаются или заканчиваются в одной точке в количестве более 2 - там ставлю кругляш), а где нет (идут в нахлёст друг над другом и электрически не соединяются): исходник | | | | Code: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <graphics.h> #include <conio.h>
int main(int argc, char** argv) { FILE *f; char filename[100]; char circuit[32]; char str[256],*po,*poo; int found = 0; int gd,gm,wr,xmax=0,ymax=0,cmax=0; long x1,y1,x2,y2; *circuit = 0; if(argc<2) { printf("\nUsage:\n\tlogigraf filename.circ [circuit]\n\n"); return -1; } strcpy(filename,argv[1]); if(argc>2) strcpy(circuit,argv[2]); printf("Load \"%s\"\n",filename); f = fopen(filename,"r"); if(f==NULL) return -2; while(1) { fgets(str,256,f); str[255] = 0; if(feof(f)) break; po = strrchr(str,'\n'); if(po!=NULL) *po = 0; if(found) { // printf("%s\n",str); } if(strstr(str,"<circuit")!=NULL) { if(*circuit==0) { printf("%s\n",str); } else { po = strstr(str,"name="); if(po!=NULL) { po = &po[6]; poo = strchr(po,'"'); if(poo!=NULL) *poo=0; printf("Found: \"%s\"\n",po); found = 1; gd=VGA; gm=VGAHI; initgraph(&gd,&gm,""); xmax = getmaxx(); ymax = getmaxy(); cmax = getmaxcolor(); setcolor(0); // setfillstyle(SOLID_FILL,1); bar(0,0,xmax,ymax); } } } else if(strstr(str,"<wire")) { if(found) { po = strstr(str," from="); if(po!=NULL) { po = &po[8]; x1 = atol(po); poo = strchr(po,','); if(poo!=NULL) { poo++; y1 = atol(poo); po = strstr(str," to="); if(po!=NULL) { po = &po[6]; x2 = atol(po); poo = strchr(po,','); if(poo!=NULL) { poo++; y2 = atol(poo); if(x1 <= xmax && y1 <= ymax) { if(x1 > 0 && x1 < xmax && y1 > 0 && y1 < ymax) { if(getpixel(x1,y1)==0) { wr = 0; if(getpixel(x1-1,y1)==0) wr++; if(getpixel(x1+1,y1)==0) wr++; if(getpixel(x1,y1-1)==0) wr++; if(getpixel(x1,y1+1)==0) wr++; if(wr>1) circle(x1,y1,3); } } if(x2 > 0 && x2 < xmax && y2 > 0 && y2 < ymax) { if(getpixel(x2,y2)==0) { wr = 0; if(getpixel(x2-1,y2)==0) wr++; if(getpixel(x2+1,y2)==0) wr++; if(getpixel(x2,y2-1)==0) wr++; if(getpixel(x2,y2+1)==0) wr++; if(wr>1) circle(x2,y2,3); } } if(x2 > xmax) x2=xmax; if(y2 > ymax) y2=ymax; line(x1,y1,x2,y2); } } } } } } } else if(strstr(str,"</circuit")!=NULL) { if(found) break; } } fclose(f); if(found) { getch(); closegraph(); // printf("%i %i %i\n",xmax,ymax,cmax); } return 0; }
| | | | |
|
02 Dec 2017 23:44 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22412 Location: Silicon Valley
|
Теперь разбираю тэг comp (компонент) - интересно, что в качестве его координат (loc=) указываются координаты первого выхода (но не для стандартных компонентов типа сплиттера или светодиода): исходник | | | | Code: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <graphics.h> #include <conio.h>
int main(int argc, char** argv) { FILE *f; char filename[100]; char circuit[32]; char str[256],ss[8],*po,*poo; int found = 0; int gd,gm,wr,xmax=0,ymax=0,cmax=0; long x1,y1,x2,y2; *circuit = 0; if(argc<2) { printf("\nUsage:\n\tlogigraf filename.circ [circuit]\n\n"); return -1; } strcpy(filename,argv[1]); if(argc>2) strcpy(circuit,argv[2]); printf("Load \"%s\"\n",filename); f = fopen(filename,"r"); if(f==NULL) return -2; while(1) { fgets(str,256,f); str[255] = 0; if(feof(f)) break; po = strrchr(str,'\n'); if(po!=NULL) *po = 0; if(found) { // printf("%s\n",str); } if(strstr(str,"<circuit")!=NULL) { if(*circuit==0) { printf("%s\n",str); } else { po = strstr(str,"name="); if(po!=NULL) { po = &po[6]; poo = strchr(po,'"'); if(poo!=NULL) *poo=0; printf("Found: \"%s\"\n",po); found = 1; gd=VGA; gm=VGAHI; initgraph(&gd,&gm,""); xmax = getmaxx(); ymax = getmaxy(); cmax = getmaxcolor(); setcolor(0); // setfillstyle(SOLID_FILL,1); bar(0,0,xmax,ymax); } } } else if(strstr(str,"<wire")) { if(found) { po = strstr(str," from="); if(po!=NULL) { po = &po[8]; x1 = atol(po); poo = strchr(po,','); if(poo!=NULL) { poo++; y1 = atol(poo); po = strstr(str," to="); if(po!=NULL) { po = &po[6]; x2 = atol(po); poo = strchr(po,','); if(poo!=NULL) { poo++; y2 = atol(poo); if(x1 <= xmax && y1 <= ymax) { if(x1 > 0 && x1 < xmax && y1 > 0 && y1 < ymax) { if(getpixel(x1,y1)==0) { wr = 0; if(getpixel(x1-1,y1)==0) wr++; if(getpixel(x1+1,y1)==0) wr++; if(getpixel(x1,y1-1)==0) wr++; if(getpixel(x1,y1+1)==0) wr++; if(wr>1) circle(x1,y1,3); } } if(x2 > 0 && x2 < xmax && y2 > 0 && y2 < ymax) { if(getpixel(x2,y2)==0) { wr = 0; if(getpixel(x2-1,y2)==0) wr++; if(getpixel(x2+1,y2)==0) wr++; if(getpixel(x2,y2-1)==0) wr++; if(getpixel(x2,y2+1)==0) wr++; if(wr>1) circle(x2,y2,3); } } if(x2 > xmax) x2=xmax; if(y2 > ymax) y2=ymax; line(x1,y1,x2,y2); } } } } } } } else if(strstr(str,"<comp")) { x1 = y1 = -1; *ss = 0; po = strstr(str," loc="); if(po!=NULL) { po = &po[7]; x1 = atol(po); poo = strchr(po,','); if(poo!=NULL) { poo++; y1 = atol(poo); } } if(strstr(str,"name=\"Button\"")!=NULL) { x1 -= 10; y1 -= 5; x2 = x1 + 10; y2 = y1 + 10; strcpy(ss," "); } else if(strstr(str,"name=\"n\"")!=NULL) { x1 -= 10; y1 -= 5; x2 = x1 + 10; y2 = y1 + 10; strcpy(ss,"N"); } else if(strstr(str,"name=\"o\"")!=NULL) { x1 -= 10; y1 -= 5; x2 = x1 + 10; y2 = y1 + 10; strcpy(ss,"O"); } else if(strstr(str,"name=\"p\"")!=NULL) { x1 -= 10; y1 -= 5; x2 = x1 + 10; y2 = y1 + 10; strcpy(ss,"P"); } else if(strstr(str,"name=\"clk\"")!=NULL) { x1 -= 30; y1 -= 10; x2 = x1 + 30; y2 = y1 + 20; strcpy(ss,"CLK"); } else if(strstr(str,"name=\"not\"")!=NULL) { x1 -= 30; y1 -= 10; x2 = x1 + 30; y2 = y1 + 20; strcpy(ss,"NOT"); } else if(strstr(str,"name=\"bln\"")!=NULL) { x1 -= 30; y1 -= 10; x2 = x1 + 30; y2 = y1 + 20; strcpy(ss,"BLN"); } else if(strstr(str,"name=\"blp\"")!=NULL) { x1 -= 30; y1 -= 10; x2 = x1 + 30; y2 = y1 + 20; strcpy(ss,"BLP"); } else if(strstr(str,"name=\"e12\"")!=NULL) { x1 -= 30; y1 -= 10; x2 = x1 + 30; y2 = y1 + 40; strcpy(ss,"E12"); } else if(strstr(str,"name=\"e21\"")!=NULL) { x1 -= 30; y1 -= 10; x2 = x1 + 30; y2 = y1 + 40; strcpy(ss,"E21"); } else if(strstr(str,"name=\"mux\"")!=NULL) { x1 -= 30; y1 -= 10; x2 = x1 + 30; y2 = y1 + 50; strcpy(ss,"MUX"); } else if(strstr(str,"name=\"mem\"")!=NULL) { x1 -= 40; y1 -= 10; x2 = x1 + 40; y2 = y1 + 40; strcpy(ss,"MEM"); } else if(strstr(str,"name=\"HalfAdder\"")!=NULL) { x1 -= 30; y1 -= 10; x2 = x1 + 30; y2 = y1 + 30; strcpy(ss,"H.A."); } else { if(x1>=0 && x1<=xmax && y1>=0 && y1<=ymax) { circle(x1,y1,5); } x1 = y1 = -1; } if(x1>=0 && x1<=xmax && y1>=0 && y1<=ymax && x2>=0 && x2<=xmax && y2>=0 && y2<=ymax) { rectangle(x1,y1,x2,y2); outtextxy(x1+2,y1+2,ss); } } else if(strstr(str,"</circuit")!=NULL) { if(found) break; } } fclose(f); if(found) { getch(); closegraph(); // printf("%i %i %i\n",xmax,ymax,cmax); } return 0; }
| | | | |
Пока разобрал только своё троичное (неизвестные программе компоненты изображены большими окружностями):
|
03 Dec 2017 00:17 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
...И откопали стюардессу...
|
03 Dec 2017 00:25 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22412 Location: Silicon Valley
|
Ну просто там проще всего графику накидать примитивами
|
03 Dec 2017 00:50 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
Я так и понял. Но зато там нет нормальных средств разработки. Valgrind появился куда как позже...
|
03 Dec 2017 00:51 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
Я бы скорее выдал бы на экран файл postscript или .svg, вот тебе и векторная графика с примитивами. Заодно не лишаешь себя человеческих инструментов.
|
03 Dec 2017 00:53 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22412 Location: Silicon Valley
|
Ну вот - накидал ещё компонентов (но со сплиттерами и светодиодами всё ещё беда) и добавил возможность ходить стрелками по полю Досовский архив с исходником (всего 368 строк сишного кода) и 16-битным EXE-шником приаттачен
|
03 Dec 2017 02:36 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22412 Location: Silicon Valley
|
Эээ... По мне так куда проще line вызывать с circle нежели городить постскрипт, а тем более svg И потом человеческий инструмент настоящего программиста - это текстовый редактор Ну и командная строка для компиляции само собой... А зачем мне валгринд? Я мегатонны памяти туда-сюда не тягаю и утечек не боюсь
|
03 Dec 2017 02:39 |
|
|
Lavr
Supreme God
Joined: 21 Oct 2009 08:08 Posts: 7777 Location: Россия
|
Наш человек! Чувствуется заряд "олдскула"!
_________________ iLavr
|
03 Dec 2017 03:05 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
Я, конечно, люблю олдскул. Но только когда программа не переваливает за десяток тысяч строк. И не притворяйтесь, что вы другого мнения
|
03 Dec 2017 03:11 |
|
|
Shaos
Admin
Joined: 08 Jan 2003 23:22 Posts: 22412 Location: Silicon Valley
|
Да я и сотню тысяч строк в текстовом редакторе глазами отлаживал бывало - и ничего В последние лет пять правда, когда программы нашей конторы стали миллионами строк измеряться, меня от девелопмента уже отодвинули Так что олдскульность остаётся прикладывать только к своим хобби
|
03 Dec 2017 03:16 |
|
|
haqreu
Maniac
Joined: 10 Mar 2017 05:30 Posts: 318
|
Не, ну я тоже бывало printfы вставлял для дебага в гиганстской софтине. Но нормальный инструмент всё же удобнее
|
03 Dec 2017 03:18 |
|
|
Who is online |
Users browsing this forum: No registered users and 7 guests |
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot post attachments in this forum
|
|