Project

General

Profile

Bug #5461

[arrays] Insufficient arrays support

Added by Sergey Smolov almost 6 years ago. Updated over 5 years ago.

Status:
Closed
Priority:
High
Category:
-
Target version:
Start date:
12/04/2014
Due date:
% Done:

100%

Estimated time:
Detected in build:
svn
Platform:
Published in build:
141226

Description

Реализованная в проекте поддержка массивов имеет два существенных ограничения.

1) radix элементов массива должен совпадать с radix индексов;

2) метод getTypeRadix для MAP всегда возвращает 10.

Эти ограничения, в частности, не позволяют создавать массивы битовых векторов (очень распространенный объект в HDL-описаниях), а также получить для них radix элементов массива.

Проблема 1) частично решена ревизией r715 (теперь все массивы имеют radix=10 для индексов - см. блок TODO), что позволяет успешно обрабатывать код HDL-описаний. Если решение устраивает - можно блок TODO удалить. Если есть необходимость создавать массивы, у которых radix индексов не всегда равен 10, то нужно эту возможность учитывать.

History

#1

Updated by Artem Kotsynyak almost 6 years ago

Проблема решится, если использовать основания по умолчанию как определено DataTypeId.radix() (2 for bv and bool, 10 for int and real)? Другими словами, используется ли где-нибудь возможность использовать другие основания при конвертации в строки? Для решения #5462 написан тип, реализующий интерфейс Map<Data, Data>, при использовании которого можно будет гарантировать, что используются основания по умолчанию.

#2

Updated by Sergey Smolov almost 6 years ago

На данный момент были отмечены только массивы из integer'ов с основанием 10 и битовых векторов с основанием 2. Но, чисто теоретически, HDL-описания могут содержать значения с произвольными натуральными основаниями >= 2. Это задача парсера - определить, какое основание используется в данный момент. В Проблеме 2 меня смутило то, что метод всегда возвращает 10.

#3

Updated by Artem Kotsynyak almost 6 years ago

Издержка интерфейса DataTypeId, так как он требует указание основания для чтения значения из строки и был изначально рассчитан на единственное значение. При использовании оснований по умолчанию MAP.radix() вообще теряет смысл, так как не будет использоваться. Насколько я понимаю, проблемы возникают непосредственно из-за необходимости работы со строками и окажутся скрытыми, если использовать Map для работы с массивами.

#4

Updated by Sergey Smolov almost 6 years ago

Метод radix() вызывается в методе getTypeRadix(), который, собственно, я и пытался использовать (что было, вообще говоря, неверно - он не для моих задач сделан). Раз код метода для MAP - заглушечный - то стоило бы отметить сей факт комментарием. Этим тогда Проблема 2 исчерпывается.

В данном тикете главная и самая существенная проблема - Проблема 1. Она костыльным образом сейчас мной решена. Если решение тебе, как специалисту по массивам, кажется нормальным - то задачу можно считать решенной (меня оно устраивает - в HDL-описаниях не встречаются массивы, у которых индексы не Integer). Если нет - то, видимо, при инициализации массивов надо отдельно передавать основания для индексов и для элементов.

#5

Updated by Sergey Smolov over 5 years ago

  • Priority changed from Normal to High

Что с этой задачей?

В преддверии выпуска нового Fortress настаиваю на её скорейшем решении.

#6

Updated by Artem Kotsynyak over 5 years ago

  • Status changed from New to Resolved

При инициализации массива из строкового представления используются основания по умолчанию для типов ключей и значений. Основание для составных типов вроде массивов считается неопределённым, методы radix() и getTypeRadix() всегда возвращают 0. Для инициализации массивов рекомендуется использовать класс DataMap (#5462).

#7

Updated by Sergey Smolov over 5 years ago

  • Status changed from Resolved to Verified
#8

Updated by Andrei Tatarnikov over 5 years ago

  • Status changed from Verified to Closed
  • % Done changed from 0 to 100
  • Published in build set to 141226

Also available in: Atom PDF