nedoPC.org

Electronics hobbyists community established in 2002
Atom Feed | View unanswered posts | View active topics It is currently 28 Mar 2024 12:28



Reply to topic  [ 410 posts ]  Go to page Previous  1 ... 14, 15, 16, 17, 18, 19, 20 ... 28  Next
Давайте думать над железкой (TRIADOR) 
Author Message
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Погоди, если я правильно помню, то в DDT у тебя строится дерево вызова функций. А у в компе троичном там циклы бывают. Как ты циклы представишь в DDT?


02 Dec 2017 15:53
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
haqreu wrote:
Погоди, если я правильно помню, то в DDT у тебя строится дерево вызова функций. А у в компе троичном там циклы бывают. Как ты циклы представишь в DDT?

Это переводилка из таблицы истинности в комбинационную схему на мультиплексорах так работает (до автоматической композиции автоматов я пока не дорос)

А в системе предопределённых функций в 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' брать для неопределённости начальных состояний)...

_________________
:dj: https://mastodon.social/@Shaos


02 Dec 2017 16:04
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Shaos wrote:
Наверное пора конвертилку уже писать на сях из файла Logisim в DDT-симуляшку...

P.S. Ну как минимум генерилку нетлиста надо...

Начал писать в досовском борланде программу по декоду 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):

Attachment:
Triador-640x480.gif
Triador-640x480.gif [ 10.79 KiB | Viewed 5474 times ]


Вот что выделилось (только тэг wire):

Attachment:
Triador-decode1.gif
Triador-decode1.gif [ 5.03 KiB | Viewed 5474 times ]

_________________
:dj: https://mastodon.social/@Shaos


02 Dec 2017 23:30
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Вроде научился определять где линии стыкуются (начинаются или заканчиваются в одной точке в количестве более 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;
}


Attachments:
Triador-decode2.gif
Triador-decode2.gif [ 6.27 KiB | Viewed 5474 times ]

_________________
:dj: https://mastodon.social/@Shaos
02 Dec 2017 23:44
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Теперь разбираю тэг 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;
}

Пока разобрал только своё троичное (неизвестные программе компоненты изображены большими окружностями):


Attachments:
Triador-decode3.gif
Triador-decode3.gif [ 8.92 KiB | Viewed 5473 times ]

_________________
:dj: https://mastodon.social/@Shaos
03 Dec 2017 00:17
Profile WWW
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Shaos wrote:
Начал писать в досовском борланде


:o

...И откопали стюардессу...


03 Dec 2017 00:25
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Ну просто там проще всего графику накидать примитивами :)

_________________
:dj: https://mastodon.social/@Shaos


03 Dec 2017 00:50
Profile WWW
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Я так и понял. Но зато там нет нормальных средств разработки. Valgrind появился куда как позже...


03 Dec 2017 00:51
Profile
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Я бы скорее выдал бы на экран файл postscript или .svg, вот тебе и векторная графика с примитивами. Заодно не лишаешь себя человеческих инструментов.


03 Dec 2017 00:53
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Ну вот - накидал ещё компонентов (но со сплиттерами и светодиодами всё ещё беда) и добавил возможность ходить стрелками по полю :)

Image

Досовский архив с исходником (всего 368 строк сишного кода) и 16-битным EXE-шником приаттачен ;)


Attachments:
LOGIGRAF.ZIP [72.59 KiB]
Downloaded 210 times

_________________
:dj: https://mastodon.social/@Shaos
03 Dec 2017 02:36
Profile WWW
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
haqreu wrote:
Я бы скорее выдал бы на экран файл postscript или .svg, вот тебе и векторная графика с примитивами. Заодно не лишаешь себя человеческих инструментов.

Эээ... По мне так куда проще line вызывать с circle нежели городить постскрипт, а тем более svg :)
И потом человеческий инструмент настоящего программиста - это текстовый редактор ;)
Ну и командная строка для компиляции само собой...

haqreu wrote:
Я так и понял. Но зато там нет нормальных средств разработки. Valgrind появился куда как позже...

А зачем мне валгринд? Я мегатонны памяти туда-сюда не тягаю и утечек не боюсь :)

_________________
:dj: https://mastodon.social/@Shaos


03 Dec 2017 02:39
Profile WWW
Supreme God
User avatar

Joined: 21 Oct 2009 08:08
Posts: 7777
Location: Россия
Reply with quote
Shaos wrote:
И потом человеческий инструмент настоящего программиста - это текстовый редактор ;)
Ну и командная строка для компиляции само собой...

Наш человек! :lol: Чувствуется заряд "олдскула"! :mrgreen:

_________________
iLavr


03 Dec 2017 03:05
Profile
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Я, конечно, люблю олдскул. Но только когда программа не переваливает за десяток тысяч строк. И не притворяйтесь, что вы другого мнения :ewink:


03 Dec 2017 03:11
Profile
Admin
User avatar

Joined: 08 Jan 2003 23:22
Posts: 22412
Location: Silicon Valley
Reply with quote
Да я и сотню тысяч строк в текстовом редакторе глазами отлаживал бывало - и ничего ;)
В последние лет пять правда, когда программы нашей конторы стали миллионами строк измеряться, меня от девелопмента уже отодвинули :roll:
Так что олдскульность остаётся прикладывать только к своим хобби :mrgreen:

_________________
:dj: https://mastodon.social/@Shaos


03 Dec 2017 03:16
Profile WWW
Maniac

Joined: 10 Mar 2017 05:30
Posts: 318
Reply with quote
Не, ну я тоже бывало printfы вставлял для дебага в гиганстской софтине. Но нормальный инструмент всё же удобнее :mrgreen:


03 Dec 2017 03:18
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 410 posts ]  Go to page Previous  1 ... 14, 15, 16, 17, 18, 19, 20 ... 28  Next

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

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.