Bug #5461
closed[arrays] Insufficient arrays support
100%
Description
Реализованная в проекте поддержка массивов имеет два существенных ограничения.
1) radix элементов массива должен совпадать с radix индексов;
2) метод getTypeRadix для MAP всегда возвращает 10.
Эти ограничения, в частности, не позволяют создавать массивы битовых векторов (очень распространенный объект в HDL-описаниях), а также получить для них radix элементов массива.
Проблема 1) частично решена ревизией r715 (теперь все массивы имеют radix=10 для индексов - см. блок TODO), что позволяет успешно обрабатывать код HDL-описаний. Если решение устраивает - можно блок TODO удалить. Если есть необходимость создавать массивы, у которых radix индексов не всегда равен 10, то нужно эту возможность учитывать.
Updated by Artem Kotsynyak over 9 years ago
Проблема решится, если использовать основания по умолчанию как определено DataTypeId.radix() (2 for bv and bool, 10 for int and real)? Другими словами, используется ли где-нибудь возможность использовать другие основания при конвертации в строки? Для решения #5462 написан тип, реализующий интерфейс Map<Data, Data>, при использовании которого можно будет гарантировать, что используются основания по умолчанию.
Updated by Sergey Smolov over 9 years ago
На данный момент были отмечены только массивы из integer'ов с основанием 10 и битовых векторов с основанием 2. Но, чисто теоретически, HDL-описания могут содержать значения с произвольными натуральными основаниями >= 2. Это задача парсера - определить, какое основание используется в данный момент. В Проблеме 2 меня смутило то, что метод всегда возвращает 10.
Updated by Artem Kotsynyak over 9 years ago
Издержка интерфейса DataTypeId, так как он требует указание основания для чтения значения из строки и был изначально рассчитан на единственное значение. При использовании оснований по умолчанию MAP.radix() вообще теряет смысл, так как не будет использоваться. Насколько я понимаю, проблемы возникают непосредственно из-за необходимости работы со строками и окажутся скрытыми, если использовать Map для работы с массивами.
Updated by Sergey Smolov over 9 years ago
Метод radix() вызывается в методе getTypeRadix(), который, собственно, я и пытался использовать (что было, вообще говоря, неверно - он не для моих задач сделан). Раз код метода для MAP - заглушечный - то стоило бы отметить сей факт комментарием. Этим тогда Проблема 2 исчерпывается.
В данном тикете главная и самая существенная проблема - Проблема 1. Она костыльным образом сейчас мной решена. Если решение тебе, как специалисту по массивам, кажется нормальным - то задачу можно считать решенной (меня оно устраивает - в HDL-описаниях не встречаются массивы, у которых индексы не Integer). Если нет - то, видимо, при инициализации массивов надо отдельно передавать основания для индексов и для элементов.
Updated by Sergey Smolov over 9 years ago
- Priority changed from Normal to High
Что с этой задачей?
В преддверии выпуска нового Fortress настаиваю на её скорейшем решении.
Updated by Artem Kotsynyak over 9 years ago
- Status changed from New to Resolved
При инициализации массива из строкового представления используются основания по умолчанию для типов ключей и значений. Основание для составных типов вроде массивов считается неопределённым, методы radix() и getTypeRadix() всегда возвращают 0. Для инициализации массивов рекомендуется использовать класс DataMap (#5462).
Updated by Sergey Smolov over 9 years ago
- Status changed from Resolved to Verified
Updated by Andrei Tatarnikov over 9 years ago
- Status changed from Verified to Closed
- % Done changed from 0 to 100
- Published in build set to 141226