Давайте думать над железкой (TRIADOR)

Уравновешенная троичная система счисления - форум переехал с http://ternary.info

Moderator: haqreu

haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

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

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

haqreu wrote:Погоди, если я правильно помню, то в DDT у тебя строится дерево вызова функций. А у в компе троичном там циклы бывают. Как ты циклы представишь в DDT?
Это переводилка из таблицы истинности в комбинационную схему на мультиплексорах так работает (до автоматической композиции автоматов я пока не дорос)

А в системе предопределённых функций в ddt.c есть MEM:

Code: Select all

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' брать для неопределённости начальных состояний)...
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23990
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

Shaos wrote:Наверное пора конвертилку уже писать на сях из файла Logisim в DDT-симуляшку...

P.S. Ну как минимум генерилку нетлиста надо...
Начал писать в досовском борланде программу по декоду ternary.circ:

 исходник

Code: Select all

#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):
Triador-640x480.gif
Вот что выделилось (только тэг wire):
Triador-decode1.gif
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23990
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

Вроде научился определять где линии стыкуются (начинаются или заканчиваются в одной точке в количестве более 2 - там ставлю кругляш), а где нет (идут в нахлёст друг над другом и электрически не соединяются):

 исходник

Code: Select all

#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;
}

You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23990
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

Теперь разбираю тэг comp (компонент) - интересно, что в качестве его координат (loc=) указываются координаты первого выхода (но не для стандартных компонентов типа сплиттера или светодиода):

 исходник

Code: Select all

#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;
}

Пока разобрал только своё троичное (неизвестные программе компоненты изображены большими окружностями):
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

Shaos wrote:Начал писать в досовском борланде
:o

...И откопали стюардессу...
User avatar
Shaos
Admin
Posts: 23990
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

Ну просто там проще всего графику накидать примитивами :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

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

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

Я бы скорее выдал бы на экран файл postscript или .svg, вот тебе и векторная графика с примитивами. Заодно не лишаешь себя человеческих инструментов.
User avatar
Shaos
Admin
Posts: 23990
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

Ну вот - накидал ещё компонентов (но со сплиттерами и светодиодами всё ещё беда) и добавил возможность ходить стрелками по полю :)

Image

Досовский архив с исходником (всего 368 строк сишного кода) и 16-битным EXE-шником приаттачен ;)
You do not have the required permissions to view the files attached to this post.
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Shaos
Admin
Posts: 23990
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

haqreu wrote:Я бы скорее выдал бы на экран файл postscript или .svg, вот тебе и векторная графика с примитивами. Заодно не лишаешь себя человеческих инструментов.
Эээ... По мне так куда проще line вызывать с circle нежели городить постскрипт, а тем более svg :)
И потом человеческий инструмент настоящего программиста - это текстовый редактор ;)
Ну и командная строка для компиляции само собой...
haqreu wrote:Я так и понял. Но зато там нет нормальных средств разработки. Valgrind появился куда как позже...
А зачем мне валгринд? Я мегатонны памяти туда-сюда не тягаю и утечек не боюсь :)
Я тут за главного - если что шлите мыло на me собака shaos точка net
User avatar
Lavr
Supreme God
Posts: 16676
Joined: 21 Oct 2009 08:08
Location: Россия

Re: Давайте думать над железкой (TRIADOR)

Post by Lavr »

Shaos wrote:И потом человеческий инструмент настоящего программиста - это текстовый редактор ;)
Ну и командная строка для компиляции само собой...
Наш человек! :lol: Чувствуется заряд "олдскула"! :mrgreen:
iLavr
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

Я, конечно, люблю олдскул. Но только когда программа не переваливает за десяток тысяч строк. И не притворяйтесь, что вы другого мнения :ewink:
User avatar
Shaos
Admin
Posts: 23990
Joined: 08 Jan 2003 23:22
Location: Silicon Valley

Re: Давайте думать над железкой (TRIADOR)

Post by Shaos »

Да я и сотню тысяч строк в текстовом редакторе глазами отлаживал бывало - и ничего ;)
В последние лет пять правда, когда программы нашей конторы стали миллионами строк измеряться, меня от девелопмента уже отодвинули :roll:
Так что олдскульность остаётся прикладывать только к своим хобби :mrgreen:
Я тут за главного - если что шлите мыло на me собака shaos точка net
haqreu
Maniac
Posts: 318
Joined: 10 Mar 2017 05:30

Re: Давайте думать над железкой (TRIADOR)

Post by haqreu »

Не, ну я тоже бывало printfы вставлял для дебага в гиганстской софтине. Но нормальный инструмент всё же удобнее :mrgreen: