feat: added support for markdown pages

This commit is contained in:
2026-01-20 02:31:21 +03:00
parent 700073571e
commit ef877ad303
8 changed files with 1429 additions and 78 deletions

View File

@@ -1,50 +1,20 @@
import BlogArea from "../components/blogpost";
// Mock data for blog posts
const blogposts = [
{
label: "Оптимизация конвейера: как мы добились IPC 1.2 в нашем RISC-V ядре",
body: "Разбираем как с помощью глубокого конвейера и точного предсказания переходов ускорили выполнение инструкций. Бенчмарки показывают прирост в 3.7x compared to naive implementation.",
publish: "5 августа 2023",
get_absolute_url: "/post/optimizatsiya-konveyera-risc-v",
tags: ["risc-v", "microarchitecture", "optimization"]
},
{
label: "RISC-V Custom Extensions: почему мы добавили свои инструкции в процессор",
body: "После 6 месяцев анализа мы расширили базовый набор команд. В статье делимся болью верификации, разработкой компиляторной поддержки и тем, как это ускорило обработку AES в 17 раз.",
publish: "12 августа 2023",
get_absolute_url: "/risc-v-custom-extensions",
tags: ["risc-v", "isa", "hardware"]
},
{
label: "Кастомный memory-mapped периферийный контроллер для RISC-V SoC",
body: "Как мы реализовали низколатентный доступ к периферии. Разбираем взаимодействие с шиной TileLink, arbitration и особенности работы с прерываниями.",
publish: "19 августа 2023",
get_absolute_url: "/memory-mapped-controller-risc-v-soc",
tags: ["risc-v", "soc", "embedded"]
},
{
label: "Hot-swap модулей в RISC-V системе: динамическая подгрузка ускорителей",
body: "Реализовали runtime-конфигурацию процессорных расширений на ПЛИС. Теперь можно подгружать крипто-ускорители и DSP блоки без перезагрузки всей системы.",
publish: "26 августа 2023",
get_absolute_url: "/hot-swap-risc-v-modules",
tags: ["risc-v", "fpga", "dynamic"]
},
{
label: "Верификация RISC-V ядра: как мы покрыли 99.8% кода формальной проверкой",
body: "Наша методология верификации с использованием UVM и SymbiYosys. Показываем как обнаружили 47 критических багов до tape-out и добились соответствия спецификации.",
publish: "2 сентября 2023",
get_absolute_url: "/verifikatsiya-risc-v-yadra",
tags: ["risc-v", "verification", "formal"]
}
];
import { getSortedPostsData } from '@/lib/posts';
import BlogArea from '@/components/blogpost';
export default function Home() {
return (
<main>
<BlogArea blogposts={blogposts} />
</main>
);
}
const blogposts = getSortedPostsData();
const formattedPosts = blogposts.map(post => ({
label: post.title,
body: post.description,
publish: new Date(post.date).toLocaleDateString('ru-RU', {
day: 'numeric',
month: 'long',
year: 'numeric',
}),
get_absolute_url: `/post/${post.slug}`,
tags: post.tags,
}));
return <BlogArea blogposts={formattedPosts} />;
}

View File

@@ -1,25 +0,0 @@
import Link from "next/link";
export default function Post() {
return (
<>
<main className="flex flex-col gap-[32px] row-start-2 items-center">
<section className="space-y-1 text-center">
<dl className="space-y-10">
<div>
<dt className="sr-only">Опубликовано</dt>
<dd className="text-base leading-6 font-medium text-gray-500 dark:text-gray-400">
Monday, December 21, 2025
</dd>
</div>
</dl>
<div>
<h1 className="text-3xl leading-9 font-extrabold tracking-tight text-gray-900 sm:text-4xl sm:leading-10 md:text-5xl md:leading-14 lg:text-3xl dark:text-gray-100">
Создание и интеграция собственного процессорного ядра на базе RISC-V с использованием языка Chisel
</h1>
</div>
</section>
</main>
</>
);
}

98
app/post/[slug]/page.tsx Normal file
View File

@@ -0,0 +1,98 @@
import { getPostData, getAllPostSlugs } from '@/lib/posts';
import { notFound } from 'next/navigation';
import Link from 'next/link';
interface PostPageProps {
params: Promise<{ slug: string }>;
}
export async function generateStaticParams() {
const slugs = getAllPostSlugs();
console.log('Генерация статических путей для slugs:', slugs);
return slugs.map((slug) => ({
slug,
}));
}
export async function generateMetadata({ params }: PostPageProps) {
const { slug } = await params;
const post = await getPostData(slug);
if (!post) {
return {
title: 'Пост не найден',
};
}
return {
title: post.title,
description: post.description,
};
}
export default async function PostPage({ params }: PostPageProps) {
const { slug } = await params;
const post = await getPostData(slug);
console.log(`Загрузка поста: ${slug}, результат:`, post ? 'найден' : 'не найден');
if (!post) {
notFound();
}
const formatDate = (dateStr: string) => {
try {
const date = new Date(dateStr);
return new Intl.DateTimeFormat('ru-RU', {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric',
}).format(date);
} catch {
return dateStr;
}
};
return (
<>
<main className="flex flex-col gap-[32px] row-start-2 items-center">
<section className="space-y-1 text-center max-w-4xl w-full px-4 mt-2">
<dl className="space-y-10">
<div>
<dt className="sr-only">Опубликовано</dt>
<dd className="text-base leading-6 font-medium text-gray-500 dark:text-gray-400">
{formatDate(post.date)}
</dd>
</div>
</dl>
<div>
<h1 className="text-3xl leading-9 font-extrabold tracking-tight text-gray-900 sm:text-4xl sm:leading-10 md:text-5xl md:leading-14 dark:text-gray-100">
{post.title}
</h1>
</div>
{post.tags.length > 0 && (
<div className="flex flex-wrap justify-center gap-2 mt-4">
{post.tags.map((tag) => (
<Link
key={tag}
href={`/tags/${tag}`}
className="inline-block border border-slate-400 px-3 py-1 rounded-full text-sm font-medium text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 transition-colors"
>
{tag}
</Link>
))}
</div>
)}
</section>
<section className="mx-auto px-4 pb-[4em] w-full px-[3em]">
<article
className="prose prose-lg dark:prose-invert prose-headings:font-bold prose-a:text-blue-500 hover:prose-a:text-blue-700 prose-code:bg-gray-100 dark:prose-code:bg-gray-800 prose-pre:bg-gray-900 dark:prose-pre:bg-gray-900 prose-img:rounded-xl prose-blockquote:border-l-4 prose-blockquote:border-blue-500 prose-blockquote:bg-gray-50 dark:prose-blockquote:bg-gray-800 prose-blockquote:italic prose-blockquote:pl-4 max-w-none"
dangerouslySetInnerHTML={{ __html: post.contentHtml }}
/>
</section>
</main>
</>
);
}

66
lib/posts.ts Normal file
View File

@@ -0,0 +1,66 @@
import fs from 'fs';
import path from 'path';
import matter from 'gray-matter';
import { remark } from 'remark';
import html from 'remark-html';
const postsDirectory = path.join(process.cwd(), 'posts');
export interface PostData {
slug: string;
title: string;
date: string;
tags: string[];
contentHtml: string;
description: string;
}
export function getAllPostSlugs(): string[] {
const fileNames = fs.readdirSync(postsDirectory);
return fileNames.map((fileName) => fileName.replace(/\.md$/, ''));
}
export function getSortedPostsData(): Omit<PostData, 'contentHtml'>[] {
const fileNames = fs.readdirSync(postsDirectory);
const allPostsData = fileNames.map((fileName) => {
const slug = fileName.replace(/\.md$/, '');
const fullPath = path.join(postsDirectory, fileName);
const fileContents = fs.readFileSync(fullPath, 'utf8');
const matterResult = matter(fileContents);
return {
slug,
title: matterResult.data.title,
date: matterResult.data.date,
tags: matterResult.data.tags || [],
description: matterResult.data.description || '',
};
});
return allPostsData.sort((a, b) => {
if (a.date < b.date) {
return 1;
} else {
return -1;
}
});
}
export async function getPostData(slug: string): Promise<PostData> {
const fullPath = path.join(postsDirectory, `${slug}.md`);
const fileContents = fs.readFileSync(fullPath, 'utf8');
const matterResult = matter(fileContents);
const processedContent = await remark()
.use(html)
.process(matterResult.content);
const contentHtml = processedContent.toString();
return {
slug,
contentHtml,
title: matterResult.data.title,
date: matterResult.data.date,
tags: matterResult.data.tags || [],
description: matterResult.data.description || '',
};
}

1167
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -9,10 +9,14 @@
"lint": "next lint"
},
"dependencies": {
"@tailwindcss/typography": "^0.5.19",
"gray-matter": "^4.0.3",
"next": "15.2.0",
"react": "^19.0.0",
"react-dom": "^19.0.0",
"react-icons": "^5.5.0"
"react-icons": "^5.5.0",
"remark": "^15.0.1",
"remark-html": "^16.0.1"
},
"devDependencies": {
"@eslint/eslintrc": "^3",

11
posts/chisel.md Normal file
View File

@@ -0,0 +1,11 @@
---
title: "Создание и интеграция собственного процессорного ядра на базе RISC-V с использованием языка Chisel"
date: "2025-12-21"
tags: ["risc-v", "chisel", "hardware"]
description: "Краткое описание"
---
# Заголовок статьи
Содержимое статьи в формате Markdown...

68
posts/riscv.md Normal file
View File

@@ -0,0 +1,68 @@
---
title: "RISC-V: Что такое и какие варианты для работы с RISC-V в России есть"
date: "2025-12-21"
tags: ["risc-v", "hardware"]
description: "Подробно о том почему российские компании выбирают RISC-V и какие варианты для развития в данной сфере есть сейчас и что может появиться в будущем. "
---
**RISC-V** (произносится «риск-файв») — это открытая и свободная архитектура набора команд (Instruction Set Architecture, ISA) для процессоров. В отличие от закрытых архитектур x86 (Intel, AMD) или ARM, спецификации RISC-V находятся в открытом доступе, а их использование не требует выплаты лицензионных отчислений. Это не конкретный процессор, а стандарт, на основе которого любая компания или исследовательская группа может разработать собственное ядро.
В условиях современных технологических ограничений RISC-V перестал быть просто академическим проектом и превратился в стратегическую возможность для создания независимой технологической базы.
## Ключевые особенности архитектуры
* **Открытость и свобода от лицензионных отчислений**: Базовая спецификация открыта, что позволяет избежать зависимости от зарубежных вендоров.
* **Модульность**: Архитектура построена по принципу «базовый набор + расширения». Можно создать как простое встроенное ядро, так и сложный многоядерный процессор для серверов.
* **Простота и элегантность**: Современный дизайн, лишенный исторического балласта, упрощает разработку и верификацию.
* **Растущая экосистема**: Вокруг RISC-V сформировалось глобальное сообщество, развиваются инструменты (компиляторы GCC, LLVM), операционные системы (Linux, Zephyr) и средства симуляции.
## Почему RISC-V стал стратегическим выбором для России
1. **Технологическая независимость**: Архитектура предоставляет полный контроль над микроархитектурой. Это значит, что можно создавать процессоры без оглядки на экспортные ограничения и политику иностранных правообладателей.
2. **Безопасность**: Открытость спецификации позволяет проводить глубокий аудит на уровне аппаратуры, исключая недокументированные возможности (backdoors).
3. **Экономическая эффективность**: Отсутствие лицензионных платежей и возможность кастомизации под конкретную задачу (например, ускорение криптографических алгоритмов) снижают стоимость владения и ускоряют выход на рынок.
4. **Развитие компетенций**: Работа с открытой архитектурой стимулирует рост фундаментальных знаний в области проектирования процессоров, а не только их применения.
## Варианты для работы с RISC-V в России: настоящее и ближайшее будущее
### 1. Образование и развитие кадров
Освоение RISC-V начинается с обучения. Уже сегодня доступны несколько путей:
* **Вузовские программы**: Ведущие технические университеты (МФТИ, МИФИ, ИТМО, СПбПУ) постепенно включают RISC-V в учебные курсы по архитектуре компьютеров и системному программированию.
* **Онлайн-курсы и вебинары**: Российские технологические компании и энтузиасты проводят открытые лекции и практикумы по основам RISC-V.
* **Лаборатории и хакатоны**: Появляются студенческие проектные лаборатории, где можно получить практический опыт в проектировании простых ядер на ПЛИС (например, на платах SiFive или отечественных аналогах).
### 2. Промышленные разработки и коммерческие продукты
Ряд российских компаний уже делает ставку на RISC-V:
* **СКБ Контур**: Разработала серию 32-битных микроконтроллеров **K1986ВК028** на ядре RISC-V (BA25) для встраиваемых систем.
* **Yadro**: Анонсировала планы по созданию собственных процессоров на основе RISC-V для инфраструктурных решений.
* **Ростех и дочерние структуры**: Ведется исследование и разработка процессорных решений для специализированных применений (промышленная автоматизация, телеком).
* **Научные центры (КНЦ РАН, ИППМ РАН)**: Активно участвуют в исследовании и создании прототипов высокопроизводительных ядер, работают над инструментами верификации и отладки.
### 3. Проекты с открытым исходным кодом
Это фундамент для будущего развития:
* **Участие в глобальных проектах**: Российские разработчики вносят вклад в международные open-source проекты, такие как ядро Linux, компиляторы, симуляторы QEMU и эмулятор Spike.
* **Создание отечественных открытых ядер**: Разработка и публикация в открытом доступе собственных процессорных ядер (например, на языке Chisel или SystemVerilog) для образовательных и промышленных целей.
* **Развитие экосистемы ПО**: Адаптация и оптимизация операционных систем (Astra Linux, Альт), компиляторов и middleware под RISC-V-платформы.
### 4. Государственные инициативы и поддержка
* **Стратегические программы**: RISC-V упоминается в ключевых документах по развитию электронной промышленности и импортозамещению как одна из приоритетных архитектур.
* **Грантовая поддержка**: Фонды (Сколково, ФСИ) и министерства финансируют НИОКР и стартапы в области проектирования процессоров и создания инструментальной базы.
* **Стандартизация**: Ведутся работы по гармонизации отечественных требований по информационной безопасности с возможностями архитектуры RISC-V.
## Будущее RISC-V в России: перспективы и вызовы
**Сценарии развития на 5-10 лет:**
1. **Доминирование в нишевых и встраиваемых системах**: Микроконтроллеры на RISC-V станут стандартом для IoT, промышленной автоматизации, автомобильной электроники.
2. **Выход в сегмент высокопроизводительных вычислений**: Появление первых отечественных серверных и HPC-процессоров на оптимизированных многоядерных RISC-V-архитектурах.
3. **Формирование полного технологического цикла**: От проектирования и производства (с учетом развития отечественных техпроцессов) до создания законченных программно-аппаратных комплексов.
4. **Интеграция в учебные программы**: RISC-V станет основной архитектурой для обучения в российских инженерных вузах, что обеспечит постоянный приток квалифицированных кадров.
**Ключевые вызовы:**
* **Создание конкурентоспособной производственной базы** (процессоры требуют современных техпроцессов).
* **Масштабирование экосистемы**: Необходимо привлечь широкий круг разработчиков прикладного ПО.
* **Конкуренция с устоявшимися решениями**: Потребуются убедительные экономические и технологические аргументы для перехода с ARM и x86.
## Заключение
RISC-V — это не просто технологическая альтернатива, а **новая парадигма развития микроэлектроники**. Для России она представляет собой уникальный исторический шанс построить независимую, безопасную и конкурентоспособную отрасль проектирования процессоров. Успех будет зависеть от слаженных усилий государства, бизнеса, науки и образовательных учреждений. Уже сегодня каждый разработчик, студент или компания, начинающая работу с RISC-V, вносит вклад в создание фундамента для цифрового суверенитета страны. Будущее архитектуры в России выглядит многообещающе, и окно возможностей открыто как никогда.